为什么此代码会抛出InputMismatchException?
Scanner scanner = new Scanner("hello world");
System.out.println(scanner.next("hello\\s*world"));
http://regexpal.com/中的相同正则表达式匹配(使用\ s代替\\ s)
答案 0 :(得分:11)
与Matcher相反,Scanner内置了字符串的标记化,默认分隔符是空格。因此,在比赛开始之前,你的“hello world”会被标记为“hello”“world”。如果您在扫描到不在字符串中的内容之前更改了分隔符,那将是匹配,例如:
Scanner scanner = new Scanner("hello world");
scanner.useDelimiter(":");
System.out.println(scanner.next("hello\\s*world"));
但似乎您的情况确实应该只使用Matcher
。
这是“按预期”使用扫描仪的示例:
Scanner scanner = new Scanner("hello,world,goodnight,moon");
scanner.useDelimiter(",");
while (scanner.hasNext()) {
System.out.println(scanner.next("\\w*"));
}
输出
hello
world
goodnight
moon
答案 1 :(得分:2)
扫描程序的默认分隔符是空格,因此扫描程序会看到两个元素 hello 和 world 。并且 hello \ s + world 不匹配hello因此抛出NoSuchElement异常。
答案 2 :(得分:2)
这些输入有效:
"C:\Program Files\Java\jdk1.6.0_21\bin\java" RegexTest hello\s+world "hello world"
'hello world' does match 'hello\s+world'
以下是代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
if (args.length > 0) {
Pattern pattern = Pattern.compile(args[0]);
for (int i = 1; i < args.length; ++i) {
Matcher matcher = pattern.matcher(args[i]);
System.out.println("'" + args[i] + "' does " + (matcher.matches() ? "" : "not ") + "match '" + args[0] +"'");
}
}
}
}
答案 3 :(得分:1)
扫描程序的构造函数采用可选模式,用于将输入序列拆分为标记。默认情况下,这是一个空白模式。
扫描器#next将返回下一个标记,如果它与给定模式匹配。换句话说,传入#next的模式默认情况下可能不包含空格。
您可以调用#useDelimiter为您的用例配置扫描程序。
答案 4 :(得分:-1)
扫描程序的默认分隔符为\\s+
如果您只想与hello\\s*world
匹配,只需致电scanner.useDelimiter("hello\\s*world"))
,然后只需scanner.next();
Alternativeley,您可以致电scanner.useDelimiter('any (escaped) char that would not occur in your text ')
并使用scanner.next("hello\\s*world"))
作为旁注,如果您希望它至少有1个空格,则需要使用+
代替*