Java的扫描仪。如何匹配空白?

时间:2013-03-06 15:19:53

标签: java regex

假设我需要匹配包含空格的括号。

这是一个片段:

String input = "( ) ( ) ( )";
Pattern pattern = Pattern.compile("\\(\\s\\)");

Scanner scanner = new Scanner(input);
scanner.useDelimiter("\\n");
Matcher matcher = pattern.matcher(input);

System.out.println(scanner.hasNext(pattern)); // false
System.out.println(matcher.find()); // true
System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3

Matcher完全符合我的需要,但Scanner没有。

问题未被正确询问。我的目的是用扫描器顺序抓取字符串中的所有()标记,因为匹配器似乎对此类任务有不方便的API。 我应该彻底阅读文档。

我需要的方法是:

scanner.findInLine(pattern);

3 个答案:

答案 0 :(得分:1)

从Scanner.hasNext(Pattern)检查javadoc:

  

如果下一个完整标记与指定模式匹配,则返回true ...

因此,由于您的模式与整个标记"( ) ( ) ( )"不匹配,因此它将返回false。

然而Scanner有一个名为findInLine的函数,可以执行您想要的操作:

scanner.findInLine(pattern); // returns "( )" or null if not found

(但是,此方法可以跳过字符...)

答案 1 :(得分:1)

当您使用"\\n"作为分隔符(因此覆盖默认值为空格)时,整个输入"( ) ( ) ( )"将成为一个标记。

hasNext尝试将完整标记与pattern匹配时,它会返回false

从文档方法Scanner.hasNext(Pattern pattern)

  

如果下一个完整标记与指定模式匹配,则返回true。

因此,在您的情况下,方法调用实际上是尝试将"( ) ( ) ( )""( )"匹配。

答案 2 :(得分:0)

        String input = "( ) ( ) ( )";
        Pattern pattern = Pattern.compile("\\(\\s\\)");

        Scanner scanner = new Scanner(input);
        scanner.useDelimiter(pattern);  //**CHANGED**
        Matcher matcher = pattern.matcher(input);

        System.out.println(scanner.hasNext()); //**CHANGED**
        System.out.println(matcher.find());
        System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3

按上述方式更新您的代码。

你误解了useDelimiter()。您必须将Pattern设置为Scanner对象的分隔符。