Uciekając przed dostaniem String regex analizowany w Javie

głosy
12

W Javie, załóżmy, że mam zmienną String S i chcę ją wyszukać wewnątrz z innego T String, tak:

   if (T.matches(S)) ...

(Uwaga: powyższa linia była T.contains () aż kilka stanowisk podkreślić, że ta metoda nie korzysta z regexes Mój złe.).

Ale teraz przypuśćmy S może mieć znaków niesmaczny w nim. Na przykład, niech S = [Hi. W lewej nawias kwadratowy będzie powodować regex niepowodzenie. Czy istnieje funkcja mogę zadzwonić do ucieczki S tak, że tak się nie stanie? W tym konkretnym przypadku, to chciałbym zostać przekształcone do „\ [hi”.

Utwórz 03/10/2008 o 20:59
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
20

String.contains nie używa regex, więc nie jest to problem w tym przypadku.

Gdzie wymagane jest wyrażenie regularne, a odrzucając ciągów z regex znaków specjalnych, użyj java.util.regex.Pattern.quote im uciec.

Odpowiedział 03/10/2008 o 21:04
źródło użytkownik

głosy
11

Jak Tom Hawtin powiedział, trzeba podać wzór. Można to zrobić na dwa sposoby (Edit: Właściwie trzy sposoby, jak wskazano przez @ diastrofizm ):

  1. Otoczyć ciąg z „Q \” i \ „E”, takich jak:

    if (T.matches("\\Q" + S + "\\E"))
    
  2. Użyj Wzorzec zamiast. Kod byłoby coś takiego:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
    if (sPattern.matcher(T).matches()) { /* do something */ }
    

    W ten sposób można buforować skompilowany Wzorzec i używać go. Jeśli używasz tego samego wyrażenia regularnego więcej niż raz, to niemal na pewno chcesz to zrobić w ten sposób.

Zauważ, że jeśli używasz wyrażeń regularnych, aby sprawdzić, czy ciąg jest wewnątrz większego łańcucha, należy umieścić. * Na początku i na końcu wyrazu. Ale to nie będzie działać, jeśli powołując się na wzór, ponieważ zostanie ona szuka rzeczywistych punktów. Tak, jesteś absolutnie pewny, że chce być przy użyciu wyrażeń regularnych?

Odpowiedział 03/10/2008 o 21:59
źródło użytkownik

głosy
6

Spróbuj Pattern.quote (String) . Będzie to naprawić wszystko, co ma szczególne znaczenie w ciąg.

Odpowiedział 03/10/2008 o 23:24
źródło użytkownik

głosy
2

Jakiś szczególny powód, aby nie używać String.indexOf () zamiast? W ten sposób będzie ona zawsze być interpretowane jako zwykły ciąg zamiast regex.

Odpowiedział 03/10/2008 o 21:01
źródło użytkownik

głosy
0

T.contains () (zgodnie z javadoc: http://java.sun.com/javase/6/docs/api/java/lang/String.html ) nie wykorzystać regexes. contains () delegaci indexOf () tylko.

Tak więc, nie ma Wyrażenia regularne używane tutaj. Myślałeś o jakimś innym sposobem ciąg?

Odpowiedział 03/10/2008 o 21:16
źródło użytkownik

głosy
0

Regex używa znaku ukośnika „\” uciec dosłownym. Biorąc pod uwagę, że Java używa również znak backslash trzeba by użyć podwójnego bashslash jak:

   String S = "\\[hi"

Że stanie się String:

  \[hi

które zostaną przekazane do wyrażenia regularnego.

Lub jeśli tylko dbają o ciągiem znaków i nie potrzebują regex można wykonać następujące czynności:

if (T.indexOf("[hi") != -1)  {
Odpowiedział 03/10/2008 o 21:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more