2

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

这是一个片段:

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 没有。

这个问题没有被正确地问到。我的目的是用扫描仪按顺序抓取字符串中的所有 ( ) 标记,因为 matcher 似乎有不方便的 API 来完成此类任务。我应该彻底阅读文档。

我需要的方法是:

scanner.findInLine(pattern);
4

3 回答 3

1

从 Scanner.hasNext(Pattern) 检查 javadoc:

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

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

然而Scanner,有一个名为的函数findInLine可以做你想做的事:

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

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

于 2013-03-06T15:27:23.897 回答
1

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

hasNext尝试将完整的令牌与pattern它返回的匹配时false

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

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

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

于 2013-03-06T15:29:08.090 回答
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()。您必须设置PatternScanner对象的分隔符。

于 2013-03-06T15:26:19.870 回答