Java 8 と Java 9 で正規表現における \R の動作が異なるのはなぜですか?
質問
次のコードは、Java 8 と 9 の両方でコンパイルされますが、動作は異なります。
class Simple {
static String sample = "\nEn un lugar\r\nde la Mancha\nde cuyo nombre\r\nno quiero acordarme";
public static void main(String args[]){
String[] chunks = sample.split("\\R\\R");
for (String chunk: chunks) {
System.out.println("Chunk : "+chunk);
}
}
}
Java8で実行すると、返ってきます。
Chunk :
En un lugar
de la Mancha
de cuyo nombre
no quiero acordarme
しかし、Java 9で実行すると、出力が異なっています。
Chunk :
En un lugar
Chunk : de la Mancha
de cuyo nombre
Chunk : no quiero acordarme
どうして?
どのように解決するのか?
この
Java ドキュメント
はUnicode標準に適合していません。Javadocは何を間違えているか
\R
がマッチするはずのものを間違えています。それは読むことができます。
\R
Unicode の改行コードはすべて\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
そのJavaのドキュメントはバグだらけです。その中で セクションで、R1.6 Line Break, Unicode Technical Standard #18 on Regular Expressions を参照してください。 には、はっきりとこう書かれています。
上記(例えば#1)のすべての行末文字やシーケンスにマッチするように、" \R" のような正規表現のメタ文字を設けることを強くお勧めします。これは次のような表現に相当します。 この式は、バックアップを避ける必要があるため、少し複雑になっています。
(?:\u{D A}|(?!\u{D A})[\u{A}-\u{D}\u{85}\u{2028}\u{2029}]
つまり、2つのコードポイント CR+LF (carriage return + linefeed) のシーケンスにのみマッチします。
または
である場合、そのセットからの単一のコードポイント。
ではない
がキャリッジリターンだけで、その後にラインフィードが続く場合です。それは、それが
をバックアップすることができないからです。
. にはCRLFは必須です。
\R
が正しく機能するためには
つまり、Java 9はもはやR1.6が強く推奨するものに準拠していないのです。さらに、Java 9 は、Java 8 では行わないことになっていた、そして行わなかったことを現在行っています。
どうやら、Sherman (Xueming Shenと読みます) に再び電話をする時が来たようです。 私は以前、形式的な適合性に関する細かい事柄について、彼と一緒に仕事をしたことがあります。
関連
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] 正規表現における非捕捉グループとは何ですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】array[idx++]+="a "は、Java 8ではidxを1回増やすが、Java 9と10では2回増やすのはなぜか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
Javaジェネリックを1つの記事で
-
シェルコマンドやスクリプトのJavaコール
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
eclipse にリソースリーク:'in' が閉じない
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.