繁体   English   中英

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

[英]/(\S)\1(\1)+/g matching all occurrences of three equal non-whitespace characters following each other

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

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

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

提前谢谢。

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

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

末尾的g表示“将此正则表达式应用于整个输入字符串,或全局”。

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

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

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

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

..根据他们的描述,您可能期望结果是fooBONKBONKbar ,因为有两组三个“x”。 但实际上结果是fooBONKbar 第一个\1匹配第二个 'x', \1+匹配第三个 'x'和它后面的任何 'x '。 如果他们只想匹配三个字符,则应该将+关闭。

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

Word

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM