1

它的给定: /(\S)\1(\1)+/g 匹配所有出现的三个相等的非空白字符。

我不明白为什么 (\S) 和第二个 (\1) 周围有 (),但第一个 (\1) 周围没有。任何人都可以帮助解释上述正则表达式的工作原理吗?

来源:http ://www.javascriptkit.com/javatutors/redev2.shtml

提前谢谢。

4

2 回答 2

3

\S需要括号来捕获其值,因此您可以使用\1. \1表示“匹配与捕获组#1 匹配的相同文本”。

我相信这个正则表达式有问题。你说你想匹配“三个相等的非空白字符”。但是这+将使这个匹配 3 个或更多相等的连续非空白字符。

最后g的意思是“将此正则表达式应用于整个输入字符串或全局”。

于 2012-04-07T18:20:44.740 回答
1

第二组括号不是必需的。它不必要地再次捕获重复的字符,同时匹配与此正则表达式相同的字符串:

/(\S)\1\1+/g

此外,正如@AlexD 指出的那样,描述应该说它至少匹配三个字符。BONK如果您在字符串中替换了该正则表达式fooxxxxxxbar

'fooxxxxxxbar'.replace(/(\S)\1\1+/g, 'BONK')

..您可能期望结果fooBONKBONKbar来自他们的描述,因为有两组三个“x”。但实际上结果是fooBONKbar;第一个\1匹配第二个'x',\1+匹配第三个'x'和任何跟随它的'x' 。如果他们只想匹配三个字符,他们应该+放弃。

我注意到其他几个类似的草率描述,加上至少一个彻底的错误:\B相当于(?!\b)(一个不是单词边界的位置),而不是[^\b](一个不是退格的字符)。就此而言,他们对单词边界的描述——“单词和空格之间的位置”——也是错误的。单词边界不是由任何特定字符定义的,比如空格——事实上,它也可以是没有任何字符来创建一个。字符串:

Word

...以单词边界开头,因为 'W' 是单词字符,并且首先,它前面没有另一个单词字符。类似地,'d' 后面没有另一个单词字符,所以字符串的结尾也是单词边界。

此外,正则表达式不知道words,只知道 word characters。单词字符的定义可能因正则表达式风格和 Unicode 或语言环境设置而异,但它始终包括[A-Za-z0-9_](ASCII 字母和数字加上下划线)。单词边界只是这些字符之一与任何其他字符(或没有其他字符,如前所述)之间的位置。

如果您想了解正则表达式,我建议您忘记该站点并从这里开始:regular-expressions.info

于 2012-04-07T20:39:22.843 回答