1

'java.util.regex.Pattern'を使用してテキストファイルから代入操作をキャプチャしようとしています。自分が探しているものを実際に認識できるように正規表現を修正しようとすると、非常にイライラします。問題を可能な限り単純化し、空白の取得に関する問題を見つけました。

この投稿は役に立ち、空白文字セットを扱う問題に光を当てますが、なぜ以下が機能しないのかという質問には答えません。

Pattern p = Pattern.compile("adfa =");
Scanner sc = new Scanner("adfa =");

if(sc.hasNext(p))
{
    String s = sc.next(p);
    System.out.println(">" + s + "<");
}
else
    System.out.println(":(");

私がこれを試してみると:

Pattern p = Pattern.compile("\\w+ *=");

次の文字列が取得されます。

"adfa="

だがしかし:

"adfa ="

次の変更を行うだけです。

Pattern p = Pattern.compile("adfa=");
Scanner sc = new Scanner("adfa=");

すべて意図したとおりに機能します!誰かが何が悪いのかを明らかにすることができますか?

4

2 に答える 2

5

ドキュメントからScanner#hasNext(Pattern): -

次の完全なトークンが指定されたパターンと一致する場合、true を返します。完全なトークンは、区切りパターンに一致する入力によって接頭辞および接尾辞が付けられます。

現在、のデフォルトの区切り文字パターンScanner\p{javaWhitespace}+. メソッドを使用してそれを見つけますScanner#delimiter(): -

Scanner sc = new Scanner("abdc =");
System.out.println(sc.delimiter());  // Prints \p{javaWhitespace}+

したがって、文字列でScannera に遭遇したとき。が終了whitespaceしたものとします。tokenしたがって、そこで停止し、読み取りトークンをパターンと一致させようとします。そしてもちろん失敗するので、 をsc.hasNext(p)返しfalseます。これが問題です。

于 2013-01-22T23:19:10.743 に答える
2

Scanner.hasNext(Pattern) javadoc から:の完全なトークンが指定されたパターンと一致する場合に true を返します。完全なトークンは、区切りパターンに一致する入力によって接頭辞と接尾辞が付けられます。

Scanner では withespace がデフォルトの区切り文字であるため、この例では、スキャナはトークン「adfa」を正規表現と一致させようとしますが、一致しません。区切り文字を改行などの別のものに変更した場合:

sc.useDelimiter("\n");

正規表現が機能するはずです。

編集:私の答えは少し遅れました!

于 2013-01-22T23:28:47.320 に答える