Java 为什么这个正则表达式捕获被排除的字符?
我有一个这样的正则表达式:Java 为什么这个正则表达式捕获被排除的字符?,java,regex,Java,Regex,我有一个这样的正则表达式: (?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,} 我想做的是找到一个从@开始并有两个或两个以上字符的模式,但是它不能在单词中间开始。 我不熟悉正则表达式,但有这样的印象:匹配但不包括字符,但我的正则表达式似乎匹配但包含字符。理想情况下,我希望“@test”返回“test”和“test@test“根本不匹配 谁能告诉我我做错了什么 谢谢。试试这个:你可以用单词边界来指定你的条件 public static void main(String[]
(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}
我想做的是找到一个从@开始并有两个或两个以上字符的模式,但是它不能在单词中间开始。
我不熟悉正则表达式,但有这样的印象:匹配但不包括字符,但我的正则表达式似乎匹配但包含字符。理想情况下,我希望“@test”返回“test”和“test@test“根本不匹配 谁能告诉我我做错了什么谢谢。试试这个:你可以用单词边界来指定你的条件
public static void main(String[] args) {
String s1 = "@test";
String s2 = "test@test";
String pattern = "\\b@\\w{2,}\\b";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(s1);
m.find();
System.out.println(m.group());
}
o/p:
@测试
throws `IllegalStateException` in the second case (s2)..
你的理解是错误的。
(…)
和(?:…)
之间的区别在于前者还创建了一个编号的匹配组,该匹配组可以通过正则表达式中的反向引用来引用,或者作为匹配后代码中捕获的匹配组来引用
您可以将代码更改为使用lookbehinds,但简单而直接的修复方法是将([A-Za-z0-9]{2,})
放在正则括号内,就像我在这里所做的那样,然后检索第一个匹配的组。(在本场景中,@
不需要任何括号,但您使用的括号是无害的。)如何:
\W@[\S]{2}[\S]*
此正则表达式捕获的字符串需要修剪并删除第一个字符。我想您最好使用以下字符:
(?
不要忘记在Java中转义反斜杠,因为在字符串文本中:
(?看起来您的正则表达式本身很好:您如何执行它?(?:…)
是一个非捕获组,这意味着它允许您使用括号(用于替换等)没有创建捕获组。你正在寻找最有可能的。Lookarounds是我所需要的,谢谢你的提示。我实际上用Lookarounds解决了这个问题,但你的回答向我解释了我做错了什么,这就是为什么我接受了它:)我的解决方案是(?的确,[@]{1}
写得简单些(!)