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

マッチャーは私が必要としていることを正確に実行しますが、スキャナーは実行しません。

質問は正しく行われていませんでした。私の目的は、スキャナーを使用して文字列内のすべての()トークンを順番に取得することでした。これは、マッチャーがそのようなタスクに不便な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照合しようとすると、が返されます。patternfalse

ドキュメントからメソッドScanner.hasNext(Pattern pattern)

次の完全なトークンが指定されたパターンと一致する場合、true を返します。

したがって、あなたの場合、メソッド呼び出しは実際に"( ) ( ) ( )"a と一致しようとしてい"( )"ます。

于 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()ました。Patternオブジェクトの区切り文字として設定する必要がありScannerます。

于 2013-03-06T15:26:19.870 に答える