首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式-修剪空白

正则表达式-修剪空白
EN

Stack Overflow用户
提问于 2014-11-04 09:14:10
回答 3查看 66关注 0票数 0

我目前正在学习正则表达式,如果能帮助理解这一点,我将不胜感激:

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

代码语言:javascript
运行
复制
        abc      

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

代码语言:javascript
运行
复制
\s*(\w+)\s*

作为*量词,由于贪婪,它将尽可能多地使用前导和尾随空格,这就只剩下字符串"abc“。这种方法似乎是可行的。

然而,我看到一些解决方案包含^和$锚点,给出了:

代码语言:javascript
运行
复制
^\s*(\w+)\s*$

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

EN

回答 3

Stack Overflow用户

发布于 2014-11-04 09:16:56

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

  • \s*(\w+)\s*将捕获foo,此foo bar字符串中的bar将不匹配此foo bar字符串
票数 1
EN

Stack Overflow用户

发布于 2014-11-04 09:22:37

为什么需要包含 ^$ 锚点?锚点定义了字符串中必须出现匹配的位置。在模式中使用锚点时,正则表达式引擎不会在字符串中向前移动,也不会使用任何字符。它只在这些位置查找匹配项。

这表示空格只能出现在字符串的开头。

代码语言:javascript
运行
复制
^       # assert position at the beginning of the string         
\s*     # whitespace (\n, \r, \t, \f, and " ") (0 or more times)

这表示空格只能出现在字符串的末尾。

代码语言:javascript
运行
复制
\s*     # whitespace (\n, \r, \t, \f, and " ") (0 or more times)
$       # assert position at the end of the string 
票数 1
EN

Stack Overflow用户

发布于 2014-11-04 10: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和_),而不匹配其他字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26726187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档