[英]/(\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.