我有这样的正则表达式:
(?:(\\s| |\\A|^))(?:@)[A-Za-z0-9]{2,}
我想要做的是找到一个以@开头并且后面有两个或更多字符的模式,但它不能从一个单词的中间开始。
我是regex的新手,但是在印象中?:匹配但是然后排除了角色,但我的正则表达式似乎匹配但包括角色。理想情况下,我希望“@test”返回“test”和“test @ test”根本不匹配。
谁能告诉我我做错了什么?
感谢。
答案 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)