9

なぜこれが機能しないのですか?

"hello[world".split("\[")

そしてこれは:

"hello[world".split("\\[")
4

2 に答える 2

9

引数が文字列として表される正規表現であるため、これは実際には異なるコンテキストでの 2 つのエスケープです。

をエスケープする必要があるの[は、エスケープしないと、正規表現で特別な意味を持つからです。正規表現のエスケープは\[. ただし\、文字列内で特別な意味を持つため、エスケープする必要があります (エスケープおよび数値で文字を表すため)。

\文字は両方のコンテキストでエスケープに使用されるため、さらに悪いことになる可能性があります。文字で分割したい場合は、正規表現を使用するため\にエスケープ ( ) する必要がありますが、2 つの文字があり、両方とも文字列コンテキストでエスケープする必要があります。定数として記述している場合、分割する元の文字列での使用にもエスケープが必要になるため、同様の分割は次のようになります。\\\

"hello\\world".split("\\\\")
于 2012-07-08T14:12:20.600 に答える
1

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
于 2012-07-12T10:04:55.773 に答える