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

时间:2016-07-18 09:58:50

标签: java regex java.util.scanner

我知道除了扫描预定义的primitive类型之外,我还可以扫描自己的用户定义模式,这在扫描更复杂的数据时很有用。我在谈论Scanner.next(String pattern)方法。 但是,在我读到的关于Java的书中,有一段说明

  

"使用正则表达式扫描时有一点需要注意。该   pattern只与下一个输入令牌匹配,所以如果你的   pattern包含一个永远不会匹配的分隔符。"

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

2 个答案:

答案 0 :(得分:2)

想象一下,您有一个逗号,作为分隔符。现在不知怎的(也许是由其他人提供的)你想出了一个模式ab,cd。由于该模式包含分隔符,因此扫描程序将首先尝试将ab,cdab匹配,然后再与cd匹配,从而导致不匹配。

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

答案 1 :(得分:0)

讨论“ 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));
}

正确打印所需的输出。 但是,当您通过使用 pattern中的空格@' '替换 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})"); // ^^ 一起使用,您会发现扫描程序未能匹配,因为该模式包含默认的定界符。

function geoFindMe() {
    // get input's value
    var coordinates = document.getElementById("coordinates").value;
    // post coordinates to "/"
    $.ajax({
        type: "POST",
        url: "/",
        data: coordinates,
        success: function() {
            // do things if successful
        }
    });
}