Bu neden çalışmıyor?Groovy: Neden köşeli parantezlerden kaçış yapmam gerekiyor?
"hello[world".split("\[")
ve yapar:
"hello[world".split("\\[")
Bu neden çalışmıyor?Groovy: Neden köşeli parantezlerden kaçış yapmam gerekiyor?
"hello[world".split("\[")
ve yapar:
"hello[world".split("\\[")
Bunun nedeni argümanının dize olarak temsil düzenli ifadedir olması nedeniyle, aslında farklı bağlamlarda iki kaçar olduğunu. [
[
[
'dan çıkmak zorundadır, aksi halde normal ifadede özel bir anlamı olacaktır. Düzenli ifadenin kaçışı onu \[
yapar. Ancak, \
'un bir dizede özel bir anlamı olduğu için (kaçmak ve karakterleri sayısal değere göre göstermek için) kaçmak gerekir.
\
karakteri her iki bağlamda kaçmak için kullanıldığı için çok daha kötü olabilir. \
karakteriyle bölmek istiyorsanız, normal ifade kullanımı için onu (\\
) kullanmanız gerekir, ancak her ikisi de dizgi bağlamında kaçması gereken iki \
karakteriniz vardır. Groovy ait
"hello\\world".split("\\\\")
farklı sürümleri farklı sonuçlar verir: Eğer sabit olarak yazıyorsanız benzer bölünmüş gibi görünecektir böylece bölme orijinal dizesinde kullanımı da, kaçış gerekir. Groovy 1.1-beta-1 ve sonrası için
,
assert "hello[world".split("\\[") == ["hello", "world"]
Tamam ileri sürerken, Groovy 1.0 ve daha önce bir onaylama hata verir. Groovy 1.0-beta-10 öncesi ve bir sözcük hata veriyor ise
assert "hello[world".split(/\[/) == ["hello", "world"]
, 1,0'a 1,0-jsr-01 bir onaylama işlemi hatası veriyor Groovy 1.1-BETA-1 itibaren tüm sürümleri, OK belirtmektedir. 1,0-beta-5 ve beta-3'ten Groovy tüm sürümleri için
"hello[world".split("\\[").each{println it}
, baskılar
hello
world
ancak 1,0-beta-4 baskılar
[.]
[.]
hello
world
@Don Roby cevap yanında groovy regex kullanırsanız, '/ \ [/' sözdizimini kullanarak çift kaçışları kısaltabilirsiniz. – matcauthon