我目前正在学习正则表达式,我很感激任何帮助理解这一点:
假设我有一个带有前导和尾随空格的字符串:
abc
我希望在删除所有空格时隔离字符串。我的想法是使用:
\s*(\w+)\s*
作为*量词,贪婪,将尽可能多地使用前导和尾随空格,这使我只留下字符串“abc”。这种方法似乎有效。
但是,我已经看到一些解决方案包含了^和$ anchors,给出了:
^\s*(\w+)\s*$
为什么需要包含^和$锚点?我知道它们的功能,但是我不明白为什么(\ w *)之前和之后的\ s *是不够的。
答案 0 :(得分:1)
因为在mulitine模式下,您需要使用锚点来匹配前导和尾随空格,否则如果输入包含两行或更多行,它也会匹配前一行中的换行符。如果您只想匹配水平空格,那么我建议\h
而不是\s
。大多数编程语言都不支持\h
\s*(\w+)\s*
会在此foo
字符串中捕获bar
,foo bar
。^\s*(\w+)\s*$
未能与此foo bar
字符串答案 1 :(得分:1)
为什么有必要加入 ^
和$
主播?好吧,锚定义了字符串中必须匹配的位置。当您在模式中使用锚点时,正则表达式引擎不会向前移动字符串或使用任何字符。它只在那些位置寻找匹配。
这表示空格必须仅出现在字符串的开头。
^ # assert position at the beginning of the string
\s* # whitespace (\n, \r, \t, \f, and " ") (0 or more times)
这表示空格必须仅出现在字符串的末尾。
\s* # whitespace (\n, \r, \t, \f, and " ") (0 or more times)
$ # assert position at the end of the string
答案 2 :(得分:0)
^\s*(\w*)\s*$
将生成this match。这不是你想要的。由于*是零或大于零,它会找到\ w零次(意味着没有任何\ w),所以它会匹配它!有点令人困惑,我知道。
让我们举例\s*(\w+)\s*
并使用和不使用^和$。让我们假设我们正试图匹配abc in" abc& " (没有引号)。正如您将从link中看到的那样,它将成功地将abc与空格匹配并省略&amp ;.
让我们尝试相同的文本,相同的正则表达式只使用^和$(请参阅this example)。没有匹配产生!但为什么?基本上,在^和$之间放一个正则表达式是:我只想要^(行的开头)和$(行的结尾)之间的东西。如果您发现任何不是这些东西的东西,请不要匹配它。
关于你的表达方式,你肯定会捕获abc,但它会与白色空格一起匹配。如果你只想匹配abc,只需输入匹配字符串的\w+
(\ w = A-Z,a-z,0-9和_),别无其他。