为什么“hello \\ s * world”与“hello world”不匹配?

时间:2011-06-10 17:08:50

标签: java regex java.util.scanner

为什么此代码会抛出InputMismatchException?

Scanner scanner = new Scanner("hello world");
System.out.println(scanner.next("hello\\s*world"));

http://regexpal.com/中的相同正则表达式匹配(使用\ s代替\\ s)

5 个答案:

答案 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个空格,则需要使用+代替*