正则表达式 - 修剪空白

时间:2014-11-04 01:14:10

标签: regex

我目前正在学习正则表达式,我很感激任何帮助理解这一点:

假设我有一个带有前导和尾随空格的字符串:

        abc      

我希望在删除所有空格时隔离字符串。我的想法是使用:

\s*(\w+)\s*

作为*量词,贪婪,将尽可能多地使用前导和尾随空格,这使我只留下字符串“abc”。这种方法似乎有效。

但是,我已经看到一些解决方案包含了^和$ anchors,给出了:

^\s*(\w+)\s*$

为什么需要包含^和$锚点?我知道它们的功能,但是我不明白为什么(\ w *)之前和之后的\ s *是不够的。

3 个答案:

答案 0 :(得分:1)

因为在mulitine模式下,您需要使用锚点来匹配前导和尾随空格,否则如果输入包含两行或更多行,它也会匹配前一行中的换行符。如果您只想匹配水平空格,那么我建议\h而不是\s。大多数编程语言都不支持\h

  • \s*(\w+)\s*会在此foo字符串中捕获barfoo 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)

使用*

时要小心
  • 表示ZERO或更多次。这可能很危险,因为即使没有实际字符也可以产生匹配。例如,此^\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和_),别无其他。