我有一个像这样的正则表达式:
(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}
我想要做的是找到一个以@开头并且后面有两个或更多字符的模式,但是它不能从单词的中间开始。
我是正则表达式的新手,但印象中 ?: 匹配但随后排除该字符,但是我的正则表达式似乎匹配但包含该字符。理想情况下,我希望“@test”返回“test”,而“test@test”根本不匹配。
谁能告诉我我做错了什么?
谢谢。
最佳答案
你的理解是错误的。 (...)
和 (?:...)
之间的区别仅在于前者还创建一个编号匹配组,可以通过反向引用来引用该匹配组在正则表达式中,或作为从匹配后的代码中捕获的匹配组。
您可以更改代码以使用lookbehinds,但简单直接的解决方法是将 ([A-Za-z0-9]{2,})
放在常规括号内,就像我一样在这里完成,并检索第一个匹配的组。 (在这种情况下,@
不需要任何括号,但您拥有的括号是无害的。)
关于java - 为什么这个正则表达式会捕获排除的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785315/