Czy Java ma wbudowaną metodę ucieczki przed dowolnym tekstem, aby można go było uwzględnić w wyrażeniu regularnym? Na przykład, jeśli moi użytkownicy wprowadzą „5 $”, chciałbym dopasować to dokładnie zamiast „5” po zakończeniu wprowadzania.
320
\Q
i\E
. Może to prowadzić do nieoczekiwanych rezultatów, na przykładPattern.quote("*.wav").replaceAll("*",".*")
skutkować\Q.*.wav\E
i nie.*\.wav
, jak można się spodziewać."mouse".toUpperCase().replaceAll("OUS","ic")
, wróciMicE
. Would't można oczekiwać, że do powrotuMICE
, ponieważ nie stosuje siętoUpperCase()
naic
. W moim przykładziequote()
jest również stosowany na.*
wstawcereplaceAll()
. Musisz zrobić coś innego, być.replaceAll("*","\\E.*\\Q")
może zadziałałoby, ale to sprzeczne z intuicją.*.wav
się w wzorzec wyrażenia regularnego\*\.wav
, a replaceAll zmieniłby go\.*\.wav
, co oznaczałoby, że dopasuj pliki, których nazwa składa się z dowolnej liczby kropek, po których następuje.wav
. Najprawdopodobniej byś tego potrzebował,replaceAll("\\*", ".*")
gdyby poszli z bardziej delikatną implementacją, która polega na rozpoznawaniu wszystkich możliwych aktywnych charcheterów wyrażeń regularnych i unikaniu ich indywidualnie ... czy to byłoby o wiele łatwiejsze?Różnica pomiędzy
Pattern.quote
iMatcher.quoteReplacement
nie była dla mnie jasna, zanim zobaczyłem następujący przykładźródło
Pattern.quote
zastępuje znaki specjalne w ciągach wyszukiwania wyrażeń regularnych, takich jak. | + () Itp., IMatcher.quoteReplacement
zastępuje znaki specjalne w ciągach zastępujących, takich jak \ 1, dla odwołań wstecznych.quoteReplacement
dba tylko o dwa symbole$
i\
które mogą być na przykład użyte w ciągach zastępczych jako odniesienia wsteczne$1
lub\1
. Dlatego nie można go używać do ucieczki / cytowania wyrażenia regularnego.$Group$
zT$UYO$HI
.$
Symbol jest wyjątkowy zarówno w strukturze oraz w wymianie:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Może być za późno, aby odpowiedzieć, ale możesz również użyć
Pattern.LITERAL
, który zignoruje wszystkie znaki specjalne podczas formatowania:źródło
Pattern.CASE_INSENSITIVE
Myślę, że to, czego szukasz
\Q$5\E
. Zobacz takżePattern.quote(s)
wprowadzone w Java5.Aby uzyskać szczegółowe informacje, zobacz Wzór javadoc.
źródło
Po pierwsze, jeśli
nie umieści 1 na końcu. Spojrzy na wyrażenie regularne wyszukiwania dla pierwszej pasującej grupy i podrzędne TO. To właśnie oznacza 1, 2 lub 3 USD w tekście zastępczym: pasujące grupy ze wzorca wyszukiwania.
Często podłączam długie ciągi tekstu do plików .properties, a następnie generuję z nich tematy i treści wiadomości e-mail. Rzeczywiście wydaje się, że jest to domyślny sposób wykonywania i18n w Spring Framework. Umieszczam tagi XML, jako symbole zastępcze, w ciągach i używam replaceAll (), aby zamienić tagi XML na wartości w czasie wykonywania.
Natknąłem się na problem polegający na tym, że użytkownik wprowadził liczbę dolarów i centów ze znakiem dolara. Zadławiono replaceAll (), a w stracktrace pojawiają się:
W tym przypadku użytkownik wpisał gdzieś „3 $” i replaceAll () zaczął szukać wyrażenia regularnego wyszukiwania dla trzeciej pasującej grupy, nie znalazł jednej i rzygnął.
Dany:
zastępując
z
Rozwiązać problem. Użytkownik może bez problemu wprowadzać dowolne znaki, w tym znaki dolara. Zachowywał się dokładnie tak, jak można się spodziewać.
źródło
Aby zabezpieczyć wzór, możesz zastąpić wszystkie symbole „\\\\”, z wyjątkiem cyfr i liter. A potem możesz umieścić w tym chronionym wzorze swoje specjalne symbole, aby ten wzór działał nie jak głupi cytowany tekst, ale naprawdę jak wzór, ale twój własny. Bez specjalnych symboli użytkownika.
źródło
Pattern.quote („blabla”) działa dobrze.
Pattern.quote () działa dobrze. Zawiera zdanie ze znakami „ \ Q ” i „ \ E ”, a jeśli nie ma „\ Q” i „\ E”. Jeśli jednak potrzebujesz wykonać prawdziwe wyrażenie specjalne (lub niestandardowe), możesz użyć tego kodu:
Ta metoda zwraca: Niektóre / \ s / wText * / \, **
Kod na przykład i testy:
źródło
Symbol ^ (Negacja) służy do dopasowania czegoś, co nie znajduje się w grupie znaków.
To jest link do wyrażeń regularnych
Oto informacje o negacji:
źródło