我目前正在学习正则表达式,如果能帮助理解这一点,我将不胜感激:
假设我有一个包含前导空格和尾随空格的字符串:
abc
我想在删除所有空格的同时隔离字符串。我的想法是使用:
\s*(\w+)\s*
作为*量词,由于贪婪,它将尽可能多地使用前导和尾随空格,这就只剩下字符串"abc“。这种方法似乎是可行的。
然而,我看到一些解决方案包含^和$锚点,给出了:
^\s*(\w+)\s*$
为什么需要包含^和$锚点?我知道它们的功能,但是我不明白为什么在(\w*)之前和之后的\s*是不够的。
发布于 2014-11-04 01:16:56
因为在多行模式下,您需要使用锚点来匹配前导空格和尾随空格,否则,如果输入包含两行或更多行,它还将匹配前一行中的换行符。如果您只想匹配水平空格,那么我建议您使用\h
而不是\s
。大多数编程语言都不支持\h
\s*(\w+)\s*
将捕获foo
,此foo bar
字符串中的bar
将不匹配此foo bar
字符串发布于 2014-11-04 01:22:37
为什么需要包含 ^
和$
锚点?锚点定义了字符串中必须出现匹配的位置。在模式中使用锚点时,正则表达式引擎不会在字符串中向前移动,也不会使用任何字符。它只在这些位置查找匹配项。
这表示空格只能出现在字符串的开头。
^ # 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
发布于 2014-11-04 02:44:41
在使用*时要小心
^\s*(\w*)\s*$
将生成this match.这不是你想要的。由于*是零或大于零,它将找到\w零次(意思是没有任何\w),所以它将匹配它!我知道,这有点让人困惑。
为什么要包含^和$?
让我们以您的示例\s*(\w+)\s*
为例,分别使用和不使用^和$。假设我们尝试在“abc &”中匹配abc (不带引号)。正如您将从这个link中看到的,它将成功地将abc与空格相匹配,并省略&。
让我们尝试相同的文本,相同的,只使用^和$的正则表达式(参见this example)。未生成匹配项!但是为什么呢?基本上,将正则表达式放在^和$之间就是说:我只需要^(行首)和$(行尾)之间的内容。如果你发现任何不是这些东西的东西,不要匹配它。
关于您的表达式,您肯定会捕获abc,但将其与空格进行匹配。如果只想匹配abc,只需输入\w+
,它将匹配字符串(\w = A-Z,a-z,0-9和_),而不匹配其他字符串。
https://stackoverflow.com/questions/26726187
复制相似问题