Dlaczego to nie działa?Groovy: Dlaczego muszę podwoić nawiasy kwadratowe?
"hello[world".split("\[")
i to robi:
"hello[world".split("\\[")
Dlaczego to nie działa?Groovy: Dlaczego muszę podwoić nawiasy kwadratowe?
"hello[world".split("\[")
i to robi:
"hello[world".split("\\[")
Jest to właściwie dwie ucieczki w różnych kontekstach, z uwagi na fakt, że argument jest wyrażeniem regularnym reprezentowane jako ciąg znaków.
Należy uciec, ponieważ [
miałoby specjalne znaczenie w wyrażeniu regularnym. Ucieczka dla wyrażenia regularnego sprawi, że będzie to \[
. Ale wtedy \
musi zostać zmienione, ponieważ ma specjalne znaczenie w łańcuchu znaków (w celu uniknięcia i przedstawienia znaków po wartości liczbowej).
Może być znacznie gorzej, ponieważ znak \
służy do ucieczki w obu kontekstach. Jeśli chcesz podzielić przez znak \
, musisz uciec z niego (\\
) w celu użycia wyrażenia regularnego, ale masz dwie znaki \
, które muszą zostać zmienione w kontekście ciągu znaków. Wykorzystanie w oryginalnym ciąg jesteś dzielenie musiałaby również ucieczkę jeśli piszesz go jako stała, więc analogiczna Podział wyglądałby następująco:
"hello\\world".split("\\\\")
Różne wersje Groovy dać różne wyniki.
Dla Groovy 1,1-beta-1 i r
assert "hello[world".split("\\[") == ["hello", "world"]
twierdzi OK, ale Groovy 1.0 i przed daje błąd twierdzenia.
assert "hello[world".split(/\[/) == ["hello", "world"]
twierdzi OK dla wszystkich wersji z 1,1-beta-1 r Groovy 1.0 JSR-01 do 1,0 daje błąd twierdzenia podczas Groovy 1,0-beta-10 i przed daje błąd leksykalny.
"hello[world".split("\\[").each{println it}
dla wszystkich wersji Groovy z 1,0-beta-5, i beta-3, drukuje
hello
world
lecz 1,0-beta-4 drukuje
[.]
[.]
hello
world
Obok @Don Roby odpowiedzi , jeśli użyjesz groźnego wyrażenia regularnego możesz skrócić podwójne eskapody używając składni '/ \ [/. – matcauthon