如何结合这些正则表达式的JavaScript

时间:2012-10-26 23:57:58

标签: java javascript regex java-ee

您好我正在尝试使用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 in JS to find No 3 Identical consecutive characters

感谢 Nohsib

2 个答案:

答案 0 :(得分:6)

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

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

您也可以删除外部的parens:

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

或者您可以在一组parens中捕获替代方案,并在末尾添加一个反向引用:

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

但是,既然你的角色类匹配所有字符,你也可以这样:

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

如果您激活DOTALL或SINGLELINE选项,则可以改为使用.

(.)\1\1

答案 1 :(得分:-1)

实际上要简单得多:

(.)\1\1

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