java - 为什么这个正则表达式会捕获排除的字符?

标签 java regex

我有一个像这样的正则表达式:

(?:(\\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/

相关文章:

java - 路由映射不起作用

java - 如何在 java 中使用 facebook 登录验证用户

java - Gradle 同步失败 : Cause: error in opening zip file Corrupt Dependency Cache

python - 最好的方法是计算 python 中列表和字符串之间的匹配次数

java - 使用正则表达式解析行

java - primefaces 可以与facelets 一起使用吗?

java - 从 IntelliJ Idea Community 运行嵌入式 Tomcat 时遇到问题

Python - 如何使用正则表达式分割字符串但保留包含分割分隔符的模式?

regex - 具体来说,RewriteCond %{QUERY_STRING}

javascript - 如何找到与特定正则表达式匹配的字符串?