1. ホーム
  2. java

[解決済み] Javaで正規表現を理解する: split("\t") vs split("\t") - when do they both work, and when should be used in Java

2022-03-14 20:20:43

質問

最近、自分のコードで正規表現を正しく使っていなかったことがわかりました。タブで区切られた文字列の例では str を使用していました。 str.split("\t") . 今になって、これは間違っていて、タブを正しく一致させるためには str.split("\\t") .

しかし、この事実を偶然にも発見したのは、別の用件で正規表現のパターンを探していたときでした。ご存知のように、欠陥のあるコード split("\t") しかし、タブ文字にマッチする正規表現を宣言する方法が間違っているのなら、なぜうまくいくのだろうかと混乱しています。したがって、Eclipseにコードをコピーするだけでなく、Javaで正規表現がどのように処理されるかを実際に理解するために、そしてなぜそれが動作するのかをあまり気にしないために、この質問をしました。

同じように、タブ区切りだけでなく、カンマ区切りのテキストに出会ったことがあります。より明確に言うと、私が解析しているタブ区切りのリストには、時々、次のような "複合" アイテムが含まれます。 item1,item2,item3 ということで、単純化するために、別々の要素として解析したいと思います。この場合、適切な正規表現は次のようになります。 line.split("[\\t,]") それとも、ここも間違っているのでしょうか?

よろしくお願いします。

どのように解決するのですか?

を使用する場合 "\t" は、その エスケープシーケンス \t は、Javaでは文字U+0009に置き換えられます。を使う場合 "\\t" の場合、エスケープシーケンス \\\\t をJavaで置き換えると \ であり、結果として \t によって解釈されます。 正規表現 パーサーは文字 U+0009 として扱います。

ですから、どちらの表記も正しく解釈されることになります。ただ、対応する文字に置き換えたときが問題なのです。