gpt4 book ai didi

java - Java Scanner 中的非捕获组被忽略

转载 作者:行者123 更新时间:2023-12-01 00:42:49 26 4
gpt4 key购买 nike

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

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

(?:            // Start of non-capturing group (0)
[ // Match any characters in square brackets [
^\\ // Match any non-\ character.
] // ]
) // End of non-capturing group (0)
@ // Match literal '@'

根据我的理解,这应该符合我的意图。

然而,当在扫描仪中使用此模式时,它只是忽略了一个事实,即非捕获组不应计入定界符,只是为了匹配,定界符(要删除/拆分的部分)应该是只是 '@'。因此,对于以下示例字符串:“Hello@World”,结果必须是 ["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

最佳答案

分隔符被认为是整个匹配,不考虑组、捕获或非捕获。

你需要的是一个后视模式,这里的语法更容易使用负向后视。

sc.useDelimiter("(?<!\\\\)@");

关于java - Java Scanner 中的非捕获组被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58347605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com