なぜこれが機能しないのですか?
"hello[world".split("\[")
そしてこれは:
"hello[world".split("\\[")
引数が文字列として表される正規表現であるため、これは実際には異なるコンテキストでの 2 つのエスケープです。
をエスケープする必要があるの[
は、エスケープしないと、正規表現で特別な意味を持つからです。正規表現のエスケープは\[
. ただし\
、文字列内で特別な意味を持つため、エスケープする必要があります (エスケープおよび数値で文字を表すため)。
\
文字は両方のコンテキストでエスケープに使用されるため、さらに悪いことになる可能性があります。文字で分割したい場合は、正規表現を使用するため\
にエスケープ ( ) する必要がありますが、2 つの文字があり、両方とも文字列コンテキストでエスケープする必要があります。定数として記述している場合、分割する元の文字列での使用にもエスケープが必要になるため、同様の分割は次のようになります。\\
\
"hello\\world".split("\\\\")
Groovy のバージョンが異なれば、結果も異なります。
Groovy 1.1-BETA-1 以降では、
assert "hello[world".split("\\[") == ["hello", "world"]
OK をアサートしますが、Groovy 1.0 以前ではアサーション エラーが発生します。
assert "hello[world".split(/\[/) == ["hello", "world"]
は 1.1-BETA-1 以降のすべてのバージョンで OK をアサートします。Groovy 1.0-jsr-01 から 1.0 ではアサーション エラーが発生しますが、Groovy 1.0-beta-10 以前では字句エラーが発生します。
"hello[world".split("\\[").each{println it}
1.0-beta-5 および beta-3 からの Groovy のすべてのバージョンの印刷
hello
world
しかし、1.0-beta-4 は印刷します
[.]
[.]
hello
world