2011-06-10 178 views
9

这段代码为什么会抛出InputMismatchException?为什么“你好*世界”不匹配“你好世界”?

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

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

+2

http://regexpal.com/测试JavaScript的正则表达式,而不是Java正则表达式。您可以尝试使用http://www.fileformat.info/tool/regex.htm来测试Java正则表达式。 – Marcelo 2011-06-10 17:16:05

+0

@Marcelo我最喜欢的在线Java正则表达式测试程序:http://www.regexplanet.com/simple/ – 2011-06-23 18:50:59

+0

@Matt谢谢,我为它下一次我需要一个书签。 – Marcelo 2011-06-23 19:50:58

回答

11

扫描仪,而不是一个Matcher,有建于串的标记化,默认的分隔符是空白。所以你的“你好世界”在比赛运行之前变成“你好”“世界”。这将是一场比赛,如果你在扫描之前改变了分隔符不是字符串的东西,如:

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 
+0

如果字符串是hello:world then ?!你不应该对你输入的内容做出假设:S – 2011-06-10 17:21:09

+0

这对于说明Navin为什么他的代码不起作用有什么关系?我说:“如果出现下面的情况,这将是一个匹配:”不是“如果出现以下情况,这将是严格正确的代码,适用于生产用途:”输入显然被认为是“hello world”;) – Affe 2011-06-10 17:24:40

+0

您可以设置一个空的分隔符而不是a: – 2011-06-10 17:25:15

-1

扫描仪具有的\\s+ 默认定界符,如果你想只匹配hello\\s*world ,只需拨打scanner.useDelimiter("hello\\s*world")),然后只需scanner.next();

替代方案劳改,你可以调用scanner.useDelimiter('any (escaped) char that would not occur in your text ')和使用scanner.next("hello\\s*world"))

作为一个侧面说明,如果你希望它有至少1个空间,你想用一个+而不是*

+0

这不起作用。 “”的分隔符标记为高级字体。 – Affe 2011-06-10 17:37:33

+0

我已经编辑过:)你需要使用一些当然不在你的输入中的字符。请注意,某些字符是特殊的正则表达式字符,您需要将它们转义才能使用它们。我总是使用一个安全的字符是# – 2011-06-10 17:39:11

1

扫描仪的构造函数的可选模式,用于将输入序列分割为令牌。默认情况下,这是一个空白模式。

如果下一个标记与给定的模式匹配,则它将返回下一个标记。换句话说,您传递给#next的模式默认情况下可能不包含空格。

您可以调用#useDelimiter为您的用例配置扫描仪。

2

扫描仪的默认分隔符是空格,所以扫描仪看到两个元素你好世界。并且hello \ s + world与hello不匹配,因此引发NoSuchElement异常。

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] +"'"); 
      } 
     } 
    } 

}