Interfejs API języka Java dla wyrażeń regularnych określa, które \s
będą pasować do białych znaków. Zatem wyrażenie regularne \\s\\s
powinno pasować do dwóch spacji.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
Celem tego jest zastąpienie wszystkich wystąpień dwóch kolejnych białych znaków pojedynczą spacją. Jednak to w rzeczywistości nie działa.
Czy mam poważne niezrozumienie wyrażeń regularnych lub terminu „białe spacje”?
"abc \xA0 def \x85 xyz"
aby zobaczyć, co mam na myśli: są tam tylko trzy pola.Odpowiedzi:
Tak, musisz pobrać wynik
matcher.replaceAll()
:źródło
Nie można używać
\s
w Javie do dopasowywania białych znaków we własnym natywnym zestawie znaków, ponieważ Java nie obsługuje właściwości białych znaków Unicode - nawet jeśli jest to ściśle wymagane, aby spełnić wymagania RL1.2 UTS # 18! Niestety, to nie jest zgodne ze standardami.Unicode definiuje 26 punktów kodowych jako
\p{White_Space}
: 20 z nich to różne rodzaje\pZ
GeneralCategory = Separator , a pozostałe 6 to\p{Cc}
GeneralCategory = Control .Biała przestrzeń jest dość stabilną właściwością, a te same istnieją praktycznie od zawsze. Mimo to Java nie ma dla nich właściwości zgodnych ze standardem Unicode, więc zamiast tego musisz użyć takiego kodu:
Teraz możesz użyć
whitespace_charclass + "+"
jako wzoru w swoimreplaceAll
.Przepraszam za to wszystko. Wyrażenia regularne Javy po prostu nie działają zbyt dobrze w swoim własnym natywnym zestawie znaków, więc naprawdę musisz przeskakiwać przez egzotyczne obręcze, aby działały.
A jeśli uważasz, biała przestrzeń jest źle, trzeba zobaczyć, co trzeba zrobić, aby dostać się
\w
i\b
w końcu zachowywać się poprawnie!Tak, jest to możliwe i tak, to przytłaczający bałagan. To nawet charytatywność. Najłatwiejszym sposobem uzyskania biblioteki regex zgodnej ze standardami dla Javy jest przejście przez JNI do rzeczy ICU. To właśnie robi Google dla Androida, ponieważ OraSun nie spełnia wymagań.
Jeśli nie chcesz tego robić, ale nadal chcesz pozostać przy Javie, mam bibliotekę do przepisywania wyrażeń regularnych typu front-end, napisałem, że „naprawia” wzorce Javy, przynajmniej po to, aby były zgodne z wymaganiami RL1.2a w UTS # 18, Wyrażenia regularne Unicode .
źródło
W przypadku Javy (nie php, nie javascript, nic innego):
źródło
kiedy wysłałem pytanie na forum Regexbuddy (aplikacja dla programistów regex), otrzymałem dokładniejszą odpowiedź na moje pytanie dotyczące języka Java:
„Autor wiadomości: Jan Goyvaerts
W Javie skróty \ s, \ d i \ w zawierają tylko znaki ASCII. ... To nie jest błąd w Javie, ale po prostu jedna z wielu rzeczy, o których należy pamiętać podczas pracy z wyrażeniami regularnymi. Aby dopasować wszystkie białe znaki Unicode, a także podziały wierszy, możesz użyć [\ s \ p {Z}] w Javie. RegexBuddy nie obsługuje jeszcze właściwości specyficznych dla języka Java, takich jak \ p {javaSpaceChar} (które dopasowują dokładnie te same znaki co [\ s \ p {Z}]).
... \ s \ s dopasuje dwie spacje, jeśli dane wejściowe są tylko ASCII. Prawdziwy problem dotyczy kodu PO, na co wskazuje przyjęta odpowiedź na to pytanie ”.
źródło
[\s\p{z}]
pomija znak „następnej linii” Unicode U + 0085. Użyj[\s\u0085\p{Z}]
.Wydaje się, że działa dla mnie:
wydrukuje:
Myślę, że zamierzałeś to zrobić zamiast swojego kodu:
źródło
W swoim celu możesz użyć tego snnippet:
Spowoduje to znormalizowanie odstępów do pojedynczych i usunięcie początkowych i końcowych białych znaków.
źródło
źródło
Java ewoluowała od momentu poruszenia tego problemu. Korzystając z
\p{Zs}
grupy, można dopasować wszystkie rodzaje znaków spacji Unicode .Dlatego jeśli chcesz zastąpić jedną lub więcej egzotycznych przestrzeni zwykłą przestrzenią, możesz to zrobić:
Warto również wiedzieć, jeśli używałeś
trim()
funkcji ciąg należy spojrzeć na przycisk (stosunkowo nowy)strip()
,stripLeading()
orazstripTrailing()
funkcje na strunach. Może pomóc ci odciąć wszelkiego rodzaju zawijasko białe znaki. Aby uzyskać więcej informacji o tym, jaka przestrzeń jest uwzględniona, zobaczCharacter.isWhitespace()
funkcję Java .źródło
Używanie białych znaków w RE jest uciążliwe, ale uważam, że działają. Problem OP można również rozwiązać za pomocą StringTokenizer lub metody split (). Jednak aby użyć RE (odkomentować println (), aby zobaczyć, jak dopasowujący rozbija ciąg), oto przykładowy kod:
Tworzy to, co następuje (skompiluj za pomocą javac i uruchom w wierszu poleceń):
% java Two21WS Początkowe: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
źródło
replaceAll()
zamiast tego możesz po prostu zadzwonić ?