2013-03-14 11 views
45

Próbuję zrozumieć Pattern.quote stosując następujący kod:Jaka jest metoda Pattern.quote?

String pattern = Pattern.quote("1252343% 8 567 hdfg gf^$545"); 
System.out.println("Pattern is : "+pattern); 

produkuje wyjście:

Pattern is : \Q1252343% 8 567 hdfg gf^$545\E 

Jakie są \Q i \E tutaj? W opisie dokumentacji podano:

Powoduje podanie literalnego wzorca String dla określonego String.

Ta metoda umożliwia utworzenie String, która może być użyta do utworzenia Pattern, która byłaby zgodna z ciągiem s, tak jakby był literalnym wzorcem.

Metaznakom lub sekwencjom unikatowym w sekwencji wejściowej nie nadano specjalnego znaczenia.

Ale Pattern.quote „s typ zwracany jest String a nie skompilowany Pattern przedmiot.

Dlaczego ta metoda jest wymagana i jakie są przykłady użycia?

Odpowiedz

54

\Q oznacza „początek dosłownego tekstu” (tj regex „open cytując”)
\E oznacza „koniec dosłownego tekstu” (tj regex „blisko cytując”)

Wywołanie metody Pattern.quote() owija ciąg w \Q...\E, który zamienia tekst w regex literał. Na przykład Pattern.quote(".*") pasowałby kropkę, a następnie gwiazdkę:

System.out.println("foo".matches(".*")); // true 
System.out.println("foo".matches(Pattern.quote(".*"))); // false 
System.out.println(".*".matches(Pattern.quote(".*"))); // true 

Celem metody jest, aby nie wymagać programista musiał pamiętać szczególne warunki \Q i \E i dodać trochę czytelności w kodzie - regex jest już wystarczająco trudny do odczytania. Porównaj:

someString.matches(Pattern.quote(someLiteral)); 
someString.matches("\\Q" + someLiteral + "\\E")); 

Nawiązując do javadoc:

Zwraca ciągiem znaków wzorca dla określonego ciągu znaków.

Ta metoda tworzy ciąg znaków, który może być użyty do utworzenia wzorca, który będzie pasował do ciągu s, tak jakby był dosłowny.

Metaznakom lub sekwencjom unikatowym w sekwencji wejściowej nie nadano specjalnego znaczenia.

+5

Poprawnym odpowiednikiem 'someString.matches (Pattern.quote (someLiteral))' jest w rzeczywistości 'someString.matches (" \\ Q "+ someLiteral.replace (" \\ E "," \\ E \\\ \ E \\ Q ") +" \\ E ")' – kbolino

+0

@kbolino Rofl. A co z zastępowaniem "\\ Q"? – Andrew

+0

@Andrew To również obsługuje: '" \\ Q \\ E ".match (Pattern.quote (" \\ Q \\ E ")) // true'. – Bohemian

7

Jeśli skompilujesz ciąg zwracany przez Pattern.quote, otrzymasz Pattern, który pasuje do literalnego ciągu, który podałeś pod quote.

\Q i \E oznaczają początek i koniec cytowanej części ciągu.

8

\Q i \E, pośród wszystkich innych, są dokładnie udokumentowane na stronie java.util.regex.Pattern Javadoc. Chodzi o "rozpocznij Q", "wycen" i oznacz obszar, w którym wszystkie znaki mają dosłowne znaczenie. Sposobem wykorzystania zwrotu Pattern.quote jest przesłanie go do Pattern.compile lub dowolnej innej metody akceptującej ciąg wzorcowy, taki jak String.split.

7

Regex często zderza się z normalnymi ciągami. Powiedzmy, że chcę wyrażenie regularne, aby wyszukać pewien ciąg, który jest znany tylko w czasie wykonywania. W jaki sposób możemy mieć pewność, że ciąg znaków nie ma wyrażenia regularnego, np. (".*.*.*")? Cytuję to.

+0

W istocie, jednym z takich przykładów jest zamiana pierwszego wystąpienia podłańcucha, ale String.replaceFirst przyjmuje wyrażenie regularne, gdy chcemy przekazać ciąg literalny. –

15

Metoda Pattern.quote cytuje część wzoru regex, aby regex interpretował go jako literały łańcuchowe.

Załóżmy, że masz jakieś dane wejściowe wprowadzone przez użytkownika do programu wyszukiwania i chcesz go wyodrębnić. Ale to wejście może mieć niebezpieczne znaki, dzięki czemu można używać

Pattern pattern = Pattern.compile(Pattern.quote(userInput)); 

Ta metoda nie zacytować Pattern ale, jak to podkreślić, okłady String w regex cytatów.

Powiązane problemy