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

用正则表达式扫描的缺点是Java

亢正德
2023-03-14

我知道除了扫描预定义的< code >原语类型,我还可以扫描自己的用户定义模式,这在扫描更复杂的数据时很有帮助。我说的是< code > scanner . next(String pattern)方法。然而,在我读过的关于Java的书中,有一段说

“使用正则表达式进行扫描时有一个警告。该模式仅与下一个输入令牌匹配,因此,如果您的模式包含分隔符,则永远不会匹配。

我不太明白这是什么意思,在哪些情况下这种扫描不适用。

共有2个答案

白学
2023-03-14

谈到《用Java思考》一书中给出的原始示例,该程序:

String threatData =
        "58.27.82.161@02/10/2005\n" +
        "204.45.234.40@02/11/2005\n" +
        "58.27.82.161@02/11/2005\n" +
        "58.27.82.161@02/12/2005\n" +
        "58.27.82.161@02/12/2005\n" +
        "[Next log section with different data format]";

Scanner sc = new Scanner(threatData);
Pattern pattern = Pattern.compile("(\\d+([.]\\d+){3})@" + "(\\d{2}/\\d{2}/\\d{4})");
                                             ///     ^
while(sc.hasNext(pattern)) {
    System.out.println(sc.next(pattern));  
    MatchResult matchResult = sc.match();
    System.out.println("Threat from " + matchResult.group(1) + " on " + matchResult.group(3));
}

正确打印所需的输出。但是,当您通过将威胁数据中的 @ 替换为空格 ' ' 并将模式中的 @ 替换为 \\s 来对其进行轻微更改时,您将观察到扫描程序无法匹配该模式,因为它包含默认分隔符。

String threatData =
        "58.27.82.161 02/10/2005\n" +
        "204.45.234.40 02/11/2005\n" +
        "58.27.82.161 02/11/2005\n" +
        "58.27.82.161 02/12/2005\n" +
        "58.27.82.161 02/12/2005\n" +
        "[Next log section with different data format]";

Scanner sc = new Scanner(threatData);
Pattern pattern = Pattern.compile("(\\d+([.]\\d+){3})\\s" + "(\\d{2}/\\d{2}/\\d{4})");
                                                //    ^^
沈德寿
2023-03-14

假设您有一个逗号< code >,作为分隔符。现在不知怎么的(可能是别人提供的)你想出了一个模式< code>ab,cd。由于模式包含分隔符,扫描仪将尝试首先将< code>ab,cd与< code>ab匹配,然后与< code>cd匹配,结果不匹配。

请注意,这是一个警告,它不一定是你容易遇到的事情。

 类似资料:
  • 我有一个字符串,我想检查它是否包含某些特定字符。如果包含此字符,则必须出现错误消息。 我有一个想法,并计划使用类“模式”和“匹配器”: 现在我需要一种正则表达式来检查我的字符串(或者换句话说,参数“source ceToScan”。正则表达式必须被过滤符号,如等等… 如何在示例中实现此解决方案?

  • 问题内容: 因此,我对 正则表达式 完全 陌生 ,并且正在尝试使用Java 来查找输入字符串中的标点符号。我不知道会提前得到哪种标点符号,只是(1)!,?,。,…都是有效的标点符号,以及(2)“ <”和“>”表示特殊含义,并且不算作标点符号。该程序本身会伪随机地构建短语,我想在它经历随机过程之前先删除句子结尾处的标点符号。 我可以用任何标点符号匹配整个单词,但匹配器只为我提供该单词的索引。换一种说

  • 问题内容: 首先,我阅读以下文档 http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html 而且我想找到除@’之外的任何标点符号,但我不太了解。 这是 : 结果是没有匹配。 是否有任何不匹配? 谢谢 MRizq 问题答案: 您要匹配两个字符,而不是一个。使用(负)前瞻应解决以下任务:

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?

  • 问题内容: 我有一个任务要匹配浮点数。我为此编写了以下正则表达式: 但是,它返回一个错误: 据我所知,我们还需要使用转义字符.。请纠正我哪里我错了。 问题答案: TL; DR 使用[.]代替.和[0-9]代替\d以避免在某些语言(例如Java)中转义问题。 感谢无名的人最初认识到这一点。 匹配浮点数的一种相对简单的模式是 这将匹配: 查看工作示例 如果您还想匹配123.(无小数点的句点),则需要稍

  • 问题内容: 我需要找到与特定正则表达式匹配的所有软件包: 基本上,包的名字应该与启动,并有后话。例如,以下软件包应匹配: 我可以做,但是有很多我不感兴趣的软件包。 是否提供通过正则表达式查找软件包的方法?或者,我应该只是通过管道传递结果来过滤掉无关的包? 此外,可能是一个的“交集” ,并有助于太。 问题答案: alecxe,我相信这是您要寻找的一线客。 如下面评论中铬酸盐所建议的那样,您可以根据需