RegExを使用して複数行の文字列を解釈しようとしていて、文字列に改行文字が含まれていると一致しないことが判明しました。私はアンカーを使用していないので、MULTILINE
モードを使用していません。 APIドキュメントによると:複数行モードでJava RegExおよび改行 - バグまたは予期される動作?
表現^ と$の試合直後または直前に、 それぞれ、ラインターミネータまたは入力シーケンスの 終わり。デフォルトでは、 の式は、 の開始シーケンスと、 入力シーケンス全体の終わりにのみ一致します。要するに
:それは明らかに、このフラグが唯一のアンカーがどのように動作するかを変更し、のようなものが「あなたの文字列に改行が含まれている場合、あなたは間違いなく、これを使用するべきではない」と言うことを言います。
public static void main(String[] args) {
Pattern p = Pattern.compile(".*");
Matcher m1 = p.matcher("Hello");
System.out.println("m1: " + m1.matches()); // true
Matcher m2 = p.matcher("Hello\r\n");
System.out.println("m2: " + m2.matches()); // false
}
これは実際にはバグですか、いくつかのドキュメントを見逃しましたか?または、JAVAは私のパターンが失敗したRegExの方言を使用しますか?私はjdk1.6.0_21
を使用しています。 Pattern docsから
標準のJava APIを使用していて、期待通りに動作しない場合は、バグを発見したという理論を追求するのではなく、疑問を抱くべきことが* APIの理解*です。 –
@Stephen私は知っている、私は知っている。しかし、アンカーを使わなくても、全体の文字列とのマッチが一致することは決してありませんでした。 JAVA APIは、これまでコンピューティング業界でこれまで遭遇したことの中で最も一貫性があり、うまく計画されていたので、私が推測したように、このメソッドがうまくいくと信じていました。 – vbence
Java APIが「一貫性があり十分に計画されている」と考えるならば、十分注意を払っているわけではありません。そんなものではない! – tchrist