2017-02-27 9 views
2

各行が "test"に等しいかどうかを確認しようとしています。次のコードを実行しようとすると、すべての行が正確に「テスト」されているため、結果は真であると考えられます。しかし、結果は偽です。java - 正規表現一致の予期しない結果

// Expected outcome: 
// "test\ntest\ntest" - should match 
// "test\nfoo\ntest" - should not match 
// "test\ntesttest\ntest" - should not match 

Pattern pattern = Pattern.compile("^test$", Pattern.MULTILINE); 
Matcher matcher = pattern.matcher("test\ntest"); 

System.out.println(matcher.matches()); // result is false 

私はここで何が欠けていますか?なぜ結果は誤りですか?

+0

ジョーが言ったように、あなたの正規表現は単語testが行の始まりと終わりであることをテストするので、単語 "test"と一致しています。 –

答えて

1

Pattern.compile("^test$", Pattern.MULTILINE)とすると、正規表現エンジンには、1行の数字がtestと一致するように尋ねられます。 Matcher#matches()を使用する場合、正規表現エンジンに完全な文字列と一致するように指示します。文字列がtestと等しくないため、結果としてfalseが返されます。

すべてtestに等しい行を含む文字列を検証するには、古いJavaのバージョンで

Pattern.compile("^test(?:\\Rtest)*$") 

を使用することができ、あなたは\nまたは\r?\n\R(任意の改行)を交換する必要があります。

online demoを参照してください:

Pattern pattern = Pattern.compile("^test(?:\\Rtest)*$"); 
Matcher matcher = pattern.matcher("test\ntest"); 
System.out.println(matcher.matches()); // => true 
2

Pattern.MULTILINEを使用しているため、文字列全体と一致しています(test\ntest)。しかし、あなたの正規表現では、文字列が開始と終了のアンカーで囲まれているので、文字列はtestという単一のインスタンスのみで構成されるように指定しています。

0

Pattern.MULTILINEは、あなたの正規表現は、デフォルトの動作ではありません行区切り、前後に^$を一致させることができます。デフォルトでは、入力の最初と最後だけが一致します。

しかし、matches()を使用すると、正規表現を入力テキスト全体と一致させようとします。なぜなら、入力値は"test"に等しくないからです。

matches()は機能しませんが、find()を使って正規表現に一致する入力の部分列を見つけることができます。 \nの前後に^$が一致するため、パターンには2つのサブシーケンスがあります。

しかし、それはちょうど私の2セントです。

Pattern pattern = Pattern.compile("^test$", Pattern.MULTILINE); 
Matcher matcher = pattern.matcher("test\ntest"); 

System.out.println(matcher.matches()); // prints "false", the whole input doesn't match a single "test" 

System.out.println(matcher.find()); // prints "true" 
System.out.println(matcher.group()); // prints "test" 

System.out.println(matcher.find()); // prints "true" 
System.out.println(matcher.group()); // prints "test" 

System.out.println(matcher.find()); // prints "false" 
+0

その場合、なぜmatches()チェックにPattern.MULTILINEを使用するのですか? – XLordalX

+0

@XLordalXあなたはしません。 find()を使用して、同じ入力の各行が指定のパターンで開始または終了することを確認します。 –

関連する問題