在Java中使用正则表达式扫描的缺点是什么

在Java中使用正则表达式扫描的缺点是什么,java,regex,java.util.scanner,Java,Regex,Java.util.scanner,我知道,除了扫描预定义的基本类型之外,我还可以扫描自己的用户定义模式,这在扫描更复杂的数据时很有用。我说的是Scanner.next(字符串模式)方法。 然而,在我读到的关于Java的书中,有一段说 “使用正则表达式扫描时有一个警告 模式仅与下一个输入标记匹配,因此如果 模式包含一个分隔符,它将永远不会匹配。“ 我真的不明白这意味着什么,在什么情况下这种扫描是不适用的想象一下你有一个逗号,作为分隔符。现在不知怎的(可能是别人提供的)你已经想出了一个模式ab,cd。由于模式包含分隔符,扫描仪将尝试

我知道,除了扫描预定义的
基本类型之外,我还可以扫描自己的用户定义模式,这在扫描更复杂的数据时很有用。我说的是
Scanner.next(字符串模式)
方法。 然而,在我读到的关于Java的书中,有一段说

“使用正则表达式扫描时有一个警告 模式仅与下一个输入标记匹配,因此如果 模式包含一个分隔符,它将永远不会匹配。“


我真的不明白这意味着什么,在什么情况下这种扫描是不适用的

想象一下你有一个逗号
作为分隔符。现在不知怎的(可能是别人提供的)你已经想出了一个模式
ab,cd
。由于模式包含分隔符,扫描仪将尝试先将
ab,cd
匹配到
ab
,然后再匹配到
cd
,导致不匹配


请注意,这是一个警告,不一定是您容易遇到的问题。

关于《用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));
}
正确打印所需的输出但是,当您通过将threatData中的
@
替换为空格
'
并将模式中的
@
替换为
\\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})");
                                                //    ^^

你指的是哪本书?因此,这不是一个针对任意未经验证的垃圾的验证站点。用Java思考,第四版-Bruce Eckel,您能解释一下示例中的分隔符和模式是如何使用的吗?我以为扫描程序会用这个模式作为分隔符。这怎么可能是两种不同的东西呢?@Codebender就像
nextInt()
一样,将扫描一个整数(使用
\n
作为定界符和其他默认定界符),而
next(字符串模式)
将扫描与模式匹配的下一个输入。首先根据分隔符对输入进行标记,然后匹配是否是正则表达式模式、整数、行等。非常感谢。我刚刚注意到存在
next(模式)
方法。我正在考虑使用
uselimiter(pattern)
将模式用作分隔符。