web-dev-qa-db-ja.com

Javaの正規表現を理解する:split( "\ t")とsplit( "\\ t")-どちらが機能するか、いつ使用するか

最近、コードで正規表現を適切に使用していないことがわかりました。タブ区切り文字列strの例を考えると、私はstr.split("\t")を使用しています。これが間違っていることに気づき、タブを適切に一致させるには、str.split("\\t")を使用する必要があります。

しかし、私は他の何かの正規表現パターンを探していたので、たまたまこの事実に偶然出会いました。ご覧のとおり、問題のあるコードsplit("\t")は私の場合は非常にうまく機能しており、タブ文字に一致する正規表現を宣言する方法が間違っているとなぜ機能するのか混乱しています。したがって、質問は、コードをEclipseに単にコピーするのではなく、Javaで正規表現がどのように処理されるかを実際に理解するために、なぜそれが機能するのかを本当に気にしないためです...

同様に、タブ区切りだけでなくカンマ区切りのテキストも見つかりました。より明確に言えば、私が解析しているタブ区切りのリストには、_item1,item2,item3_のような「複合」アイテムが含まれていることがあります。簡単にするために、それらを個別の要素として解析したいと思います。その場合、適切な正規表現は次のようになります:line.split("[\\t,]")、またはここでも間違っていますか?

前もって感謝します、

31
posdef

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

したがって、両方の表記が正しく解釈されます。対応するキャラクターに置き換えられたときの問題です。

41
Gumbo

\はJavaではエスケープ文字と見なされるため、正しい正規表現を取得するには、\\およびtでエスケープしてタブを示す必要があります。

これ チュートリアルはさらに役立ちます

0
Jaydeep Patel