当前位置: 首页 > 知识库问答 >
问题:

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

姬坚成
2023-03-14

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

我的RegEx:(?:[^\\])@

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

从,我的理解,这应该对我的意图有效。

然而,当在扫描仪中使用此模式时,它只是忽略了这样一个事实,即不应将非捕获组计算到分隔符中,只是为了与之匹配,分隔符(要删除/拆分的部分)应仅为“@”。因此,对于以下示例String:“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

共有2个答案

轩辕鸿
2023-03-14

扫描仪不使用“全部替换”之类的采集组。

相反,你应该使用消极的向后看。所以你的模式看起来像这样:

<代码>(?

这还清理了所需的否定类。

其中 被简单地替换为

罗安宁
2023-03-14

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

你需要的是一个外观隐藏模式,并且语法在这里使用负的视觉隐藏更容易。

sc.usedelimiter(“(?

 类似资料:
  • 我的程序需要接受整数、单个字符或一个特定字符串(本例中我将使用)。虽然每一个都可以用空格分隔,但不需要这样做。 目前,我的解析代码依赖于,如下所示: 目前,我的程序将接受输入像没有任何问题。然而,它也应该接受相同的输入,没有任何空白(),并以相同的方式解释它,并且在我当前的代码中,单个数字被错误地解释为字符。 我觉得原因可能是我使用的正则表达式。但是,添加

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 本文向大家介绍浅谈PHP正则中的捕获组与非捕获组,包括了浅谈PHP正则中的捕获组与非捕获组的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中

  • 这不是重复的...在我看来。我不是在问它的有用性。如果可以的话,我要求澄清定义。不要投反对票,请解释一下。如果我认为这篇文章对其他读者来说很愚蠢,我会删除它。 其中显示是这样的 如果后面是什么?:应为“普通括号的非捕获版本”。匹配括号内的任何正则表达式,但在执行匹配或稍后在模式中引用后,无法检索组匹配的子字符串。” 为什么它仍然返回字符串“animal=”? (Python 3.6.3)f是:

  • 我有以下3种方法: > 方法:获取文本并将其单词拆分为特定字符串,然后将其放入字符串数组中。 方法:计算数组中仅由大小写字母组成的字符串的数量。 现在问题来了,如果我调用第三个方法首先通过生成一个文本。 但不知怎么的,代码只是跳过了行text=input.nextLine();并抛出异常(MSG)字符串为空。执行文本“Enter a text:”,后面直接跟着异常。但我无法输入任何文本。 如果我将

  • 问题内容: 我刚刚了解了Java的Scanner类,现在我想知道它如何与StringTokenizer和String.Split进行比较/竞争。我知道StringTokenizer和String.Split仅适用于字符串,那么为什么要对字符串使用扫描器?扫描仪是否仅打算一站式进行拆分? 问题答案: 他们本质上是课程的马。 设计用于需要解析字符串,提取不同类型数据的情况。它非常灵活,但是可以说它并没