2

您好我正在尝试在 JS 中使用 regEx 来识别 3 个相同的连续字符(可以是字母、数字以及所有非字母数字字符)

这标识了 3 个相同的连续字母和数字:'(([0-9a-zA-Z])\1\1)'
这标识了 3 个相同的连续非字母数字:'(([^0-9a-zA-Z]) \1\1)'

我正在尝试将两者结合起来,如下所示:'(([0-9a-zA-Z])\1\1)|(([^0-9a-zA-Z])\1\1)'

但我做错了什么并且它不起作用..(为'88aa3BBdd99@@'返回true)

编辑:要找到 NO 3 个相同的字符,这似乎是错误的 /(^([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1)/ --> RegEx在JS中找到没有3个相同的连续字符

感谢 Nohsib

4

2 回答 2

6

问题是在整个正则表达式中,反向引用是从左到右计算的。因此,如果将它们结合起来,您的数字会发生变化:

(([0-9a-zA-Z])\2\2)|(([^0-9a-zA-Z])\4\4)

您还可以删除外部括号:

([0-9a-zA-Z])\1\1|([^0-9a-zA-Z])\2\2

或者,您可以一起捕获一组括号中的备选方案,并将一个反向引用附加到末尾:

([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1

但是由于您的字符类无论如何都匹配所有字符,因此您也可以像这样:

([\s\S])\1\1

如果您激活 DOTALL 或 SINGLELINE 选项,您可以使用 a.代替:

(.)\1\1
于 2012-10-27T00:02:41.013 回答
-1

它实际上要简单得多:

(.)\1\1

(.)匹配任何字符,每个字符\1都是与第一个捕获组匹配的确切字符串匹配的反向引用。您应该知道.实际匹配的内容,然后修改组(在括号中)以满足您的确切需求。

于 2012-10-27T00:01:57.863 回答