我知道除了扫描预定义的primitive
类型之外,我还可以扫描自己的用户定义模式,这在扫描更复杂的数据时很有用。我在谈论Scanner.next(String pattern)
方法。
但是,在我读到的关于Java的书中,有一段说明
"使用正则表达式扫描时有一点需要注意。该 pattern只与下一个输入令牌匹配,所以如果你的 pattern包含一个永远不会匹配的分隔符。"
我真的不明白这意味着什么,在哪种情况下这种类型的扫描不适用
答案 0 :(得分:2)
想象一下,您有一个逗号,
作为分隔符。现在不知怎的(也许是由其他人提供的)你想出了一个模式ab,cd
。由于该模式包含分隔符,因此扫描程序将首先尝试将ab,cd
与ab
匹配,然后再与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
}
});
}