忽略Java扫描程序中的非捕获组

忽略Java扫描程序中的非捕获组,java,regex,java.util.scanner,delimiter,Java,Regex,Java.util.scanner,Delimiter,我试图让扫描器在每个@符号上拆分一个字符串,除非转义(或在行首) 我的正则表达式: (?:[^\\])@ 从我的理解来看,这应该符合我的意图 但是,在扫描仪中使用此模式时,它忽略了一个事实,即不应将非捕获组计入分隔符,只是为了与之匹配,分隔符(要移除/拆分的部分)应仅为“@”。因此,对于以下示例字符串:Hello@World,结果必须是[“你好”,“世界”] 除了运行下面的代码示例: private static void test() { try (Scanner sc = new S

我试图让扫描器在每个@符号上拆分一个字符串,除非转义(或在行首)

我的正则表达式:
(?:[^\\])@

从我的理解来看,这应该符合我的意图

但是,在扫描仪中使用此模式时,它忽略了一个事实,即不应将非捕获组计入分隔符,只是为了与之匹配,分隔符(要移除/拆分的部分)应仅为“@”。因此,对于以下示例字符串:Hello@World,结果必须是[“你好”,“世界”]

除了运行下面的代码示例:

private static void test() {
    try (Scanner sc = new Scanner("test@here")) {
        sc.useDelimiter("(?:[^\\\\])@"); // Every unescaped @ sign.
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }   
}
收益率:

tes
here
而不是预期的:

test
here

分隔符被视为整个匹配,而不考虑组、捕获或不捕获

您需要的是一个lookbehind模式,这里的语法更容易使用负lookbehind


sc.useDelimiter((?扫描仪不使用捕获组

相反,您应该使用“反向向后看”。因此,您的模式应该如下所示:

这也会清除所需的否定类


其中,
被简单地替换为
,使非捕获组成为一个负面的隐藏组。

好吧,你写得更快了。但是我认真地在再次阅读regex101之后找到了解决方案。谢谢你的帮助。我认为非捕获组的名称非常混乱,我没有想到根本就不是负面的lookbehind。我不太会使用负面的lookbehind,因为我现在主要使用JavaScript,而且当代码必须在web浏览器上运行时,目前只有Chrome支持lookbehind。那么你用什么来代替lookbehind呢?非捕获的东西?比如非捕获的东西总是被遵守。不要偷偷地忽略红色就像在java中一样。我最后不得不使用一个捕获组来完成一个本应是查找的任务,然后再将这些任务拼合在一起。如果你使用这个方法,那么转义将不起作用。例如,“Hello\@World”不应该在@上划界,但是Hello@World“应该。请使用my和您的分隔符检查regex101,以查看它捕获的内容的差异。
test
here