Gumbo był tuż za pomocą look-behind assertion, ale w przypadku, gdy ciąg zawiera uciekł znak ucieczki (np \\
) tuż przed przecinkiem, podział może pęknąć. Zobacz ten przykład:
test1\,test1,test2\\,test3\\\,test3\\\\,test4
Jeśli tak prosty look-tył podział na (?<!\\),
jako sugerowanej Gumbo, łańcuch zostanie podzielony na dwie części tylko test1\,test1
i test2\\,test3\\\,test3\\\\,test4
. Dzieje się tak dlatego, że obserwatorzy po prostu sprawdzają jedną postać z powrotem dla postaci ucieczki. Co właściwie byłoby poprawne, jeśli łańcuch jest podzielony na przecinki i przecinki poprzedzone parzystą liczbą znaków ewakuacyjnych.
Aby to osiągnąć nieco bardziej skomplikowane (podwójne) look-za potrzebne jest wyrażenie:
(?<!(?<![^\\]\\(?:\\{2}){0,10})\\),
Używając tego bardziej skomplikowanego wyrażenia regularnego w Javie, znowu wymaga uciec wszystko \
przez \\
. Tak to powinno być bardziej wyrafinowany odpowiedź na pytanie:
"any comma separated string".split("(?<!(?<![^\\\\]\\\\(?:\\\\{2}){0,10})\\\\),");
Uwaga: Java nie obsługuje nieskończone powtórzeń wewnątrz lookbehinds. Dlatego tylko do 10 powtarzających się znaków podwójnych ewakuacyjnych są sprawdzane za pomocą wyrażenia {0,10}
. W razie potrzeby można zwiększyć tę wartość, dostosowując drugą wartość.
Możliwe są również następujące: "abc:" def: ghi ": jkl'? –