なぜString.replaceAll()の仕事は、Java 9からのJava 8で異なっていますか?

阜陽劉:

なぜこのコードの出力02が、o2以上?

"o2".replaceAll("([oO])([^[0-9-]])", "0$2")
チャールズDowbecki:

ほとんどの場合起因するJDK-6609854およびJDK-8189343(あなたの例では取り扱い負のネストされた文字クラスを報告しました[^[0-9-]])。この動作は、9および10で修正されましたが、修正が8にバックポートされていなかったのJava 8のためのバグは、次のように説明されています。

Javaでは、否定はないではない、入れ子に登場するものに適用されます[brackets]

だから、[^c]あなたが期待するように、「c」を一致していません。

[^[c]]「C」と一致しません。どのような私は期待されていません。

[[^c]] 「c」を一致していません

同じことは、範囲またはプロパティ式にも当てはまる - 彼らしている内部ブラケット、アウトレベルの否定は、それらに影響を与えていない場合。

[^a-z] からの反対があります [^[a-z]]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=37572&siteId=1