【发布时间】:2020-02-09 08:33:13
【问题描述】:
我试图让扫描仪在每个 @ 符号上拆分一个字符串,除非转义(或在行首)
我的正则表达式:
(?:[^\\])@
(?: // 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
【问题讨论】:
-
如果你使用它,那么转义将不起作用,例如"Hello\@World" 不应该在 @ 上定界,但 "Hello@World" 应该。检查 regex101,使用我和你的分隔符来查看它捕获的内容的区别。
标签: java regex java.util.scanner delimiter