Regex negation?

三世轮回 提交于 2019-12-09 00:25:37

问题


I'm playing Regex Golf (http://regex.alf.nu/) and I'm doing the Abba hole. I have the following regex that matches the wrong side entirely (which is what I was trying to do):

(([\w])([\w])\3\2)

However, I'm trying to negate it now so it matches the other side. I can't seem to figure that part out. I tried:

(?!([\w])([\w])\3\2)

But that didn't work. Any tips from the regex masters?


回答1:


You can make it much shorter (and get more points) by simply using . and removing unnecessary parens:

^(?!.*(.)(.)\2\1)

It just makes sure that there's no "abba" ("abba" here means 4 letters in that particular order we don't want to match) in any part of the string without having to match the whole word.




回答2:


Using the explanation here: https://stackoverflow.com/a/406408/584663

I came up with: ^((?!((\w)(\w)\4\3)).)*$




回答3:


The key here turns out to be the leading caret, ^, and the .*

(?! ...) is a look-ahead construct, and so does not advance the regex processing engine.

/(?! ...)/ on its own will correctly return a negative result for items matching the expression within; but for items which do not match (...) the regex engine continues processing. However if your regex only contains the (?! ) there is nothing left to process, and the regex processing position never advances. (See this great answer).

Apparently since the remaining regex is empty, it matches any zero-width segment of a string, i.e. it matches any string.

[begin SWAG]

With the caret ^ present, the regex engine is able to recognize that you are looking for a real answer and that you do not want it to tell you the string contains zero-width components.

[end SWAG]

Thus it is able to correctly fail to match when the (?! ) succeeds.



来源:https://stackoverflow.com/questions/20774437/regex-negation

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