How to combine these regex for javascript

只愿长相守 提交于 2020-01-15 04:56:05

问题


Hi I am trying to use regEx in JS for identifying 3 identical consecutive characters (could be alphabets,numbers and also all non alpha numeric characters)

This identifies 3 identical consecutive alphabets and numbers : '(([0-9a-zA-Z])\1\1)'
This identifies 3 identical consecutive non alphanumerics : '(([^0-9a-zA-Z])\1\1)'

I am trying to combine both, like this : '(([0-9a-zA-Z])\1\1)|(([^0-9a-zA-Z])\1\1)'

But I am doing something wrong and its not working..(returns true for '88aa3BBdd99@@')

Edit : And to find NO 3 identical characters, this seems to be wrong /(^([0-9a-zA-Z]|[^0-9a-zA-Z])\1\1)/ --> RegEx in JS to find No 3 Identical consecutive characters

thanks Nohsib


回答1:


The problem is that backreferences are counted from left to right throughout the whole regex. So if you combine them your numbers change:

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

You could also remove the outer parens:

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

Or you could just capture the alternatives in one set of parens together and append one back-reference to the end:

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

But since your character classes match all characters anyway you can have that like this as well:

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

And if you activate the DOTALL or SINGLELINE option, you can use a . instead:

(.)\1\1



回答2:


It's actually much simpler:

(.)\1\1

The (.) matches any character, and each \1 is a back reference that matches the exact string that was matched by the first capturing group. You should be aware of what the . actually matches and then modify the group (in the parentheses) to fit your exact needs.



来源:https://stackoverflow.com/questions/13095892/how-to-combine-these-regex-for-javascript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!