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?
ベストアンサー1
まず、修飾語を間違った前提で使用しています。
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: