1. ホーム
  2. java

[解決済み] 正規表現による複数行のテキストとのマッチング

2022-04-15 12:42:22

質問

javaを使用して複数行のテキストをマッチングしようとしています。その際 Pattern クラスと Pattern.MULTILINE モディファイアを使用すると、マッチングが可能になりますが (?m).

同じパターンで (?m) を使用し String.matches は動作しないようです。

何か見落としているのは確かですが、見当もつきません。正規表現はあまり得意ではありません。

これは私が試したものです

String test = "User Comments: This is \t a\ta \n test \n\n message \n";

String pattern1 = "User Comments: (\\W)*(\\S)*";
Pattern p = Pattern.compile(pattern1, Pattern.MULTILINE);
System.out.println(p.matcher(test).find());  //true

String pattern2 = "(?m)User Comments: (\\W)*(\\S)*";
System.out.println(test.matches(pattern2));  //false - why?

解決方法は?

まず、間違った前提でモディファイアを使用しています。

Pattern.MULTILINE または (?m) は、Java にアンカーを受け入れるよう指示します。 ^$ を使えば、各行の最初と最後にマッチします (そうでなければ、文字列全体の最初と最後だけにマッチします)。

Pattern.DOTALL または (?s) は、ドットが改行文字にもマッチするようにJavaに指示します。

次に、あなたの場合、正規表現が失敗しています。 matches() メソッドにマッチすることを期待します。 全体 の後に何文字か残っているので、もちろんうまくいきません。 (\\W)*(\\S)* がマッチしました。

つまり、単純に文字列の先頭が User Comments: という正規表現を使用します。

^\s*User Comments:\s*(.*)

と共に Pattern.DOTALL オプションで指定します。

Pattern regex = Pattern.compile("^\\s*User Comments:\\s+(.*)", Pattern.DOTALL);
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group(1);
} 

ResultString の後にテキストが含まれます。 User Comments: