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

时间:2014-07-16 15:54:52

标签: java regex

我有这样的正则表达式:

(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}

我想要做的是找到一个以@开头并且后面有两个或更多字符的模式,但它不能从一个单词的中间开始。

我是regex的新手,但是在印象中?:匹配但是然后排除了角色,但我的正则表达式似乎匹配但包括角色。理想情况下,我希望“@test”返回“test”和“test @ test”根本不匹配。

谁能告诉我我做错了什么?

感谢。

4 个答案:

答案 0 :(得分:2)

您的理解不正确。 (...)(?:...)之间的区别仅在于前者还创建了一个编号匹配组,可以在正则表达式中引用反向引用,或者作为匹配后代码中的捕获匹配组引用。

您可以更改代码以使用lookbehinds,但简单而直接的解决方法是将([A-Za-z0-9]{2,})置于常规括号内,就像我在此处所做的那样,并检索第一个匹配的组。 (@在这种情况下不需要围绕它的任何括号,但你拥有的那些是无害的。)

答案 1 :(得分:0)

试试这个:您可以使用单词边界来指定您的条件。

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:

@test

throws `IllegalStateException` in the second case (s2).. 

答案 2 :(得分:0)

怎么样: \ W @ [\ S] {2} [\ S] *

需要修剪此正则表达式捕获的字符串并删除第一个字符。

答案 3 :(得分:0)

我想你最好需要以下一个:

(?<=(?<!\w)@)\w{2,}

Regular expression visualization

Debuggex Demo

不要忘记在Java字符串中逃避Java中的反斜杠:

(?<=(?<!\\w)@)\\w{2,}