Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个正则表达式捕获被排除的字符?_Java_Regex - Fatal编程技术网

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}
写得简单些(!)