2012-05-09 10 views
5

Oto problem: użytkownik ma pole tekstowe, do którego może wpisać filtr . Filtr do filtrowania niefiltrowanych danych. Użytkownik, doświadczając prania mózgu Oracle Forms, nie ma żadnych znaków specjalnych innych niż%, co, jak sądzę, oznacza mniej więcej wyrażenie ". *" W Javie.Jak uciec od wszystkich znaków specjalnych regex, ale nie wszystkie naraz (przez Pattern.quote()), tylko jeden po drugim

Jeżeli osoba Użytkownik jest dobrze wychowane, dana osoba będzie wpisać rzeczy jak „CTHULH%”, w którym to przypadku można skonstruować schemat:

Pattern.compile(inputText.replaceAll("%", ".*")); 

Ale jeśli osoba Użytkownik pochodzi z Innsmouth, insurmountably będzie on wpisać "+ \ [a - # $%^& * (." niszcząc mój program za pomocą kilku prostych naciśnięć klawiszy to nie zadziała:

Pattern.compile(Pattern.quote(inputText).replaceAll("%", ".*")); 

jak to umieścić \ Q na początku i \ E. na końcu ciągu, sprawdzanie mojej opcji% ->. * switch.

Pytanie brzmi: czy muszę wyszukać wszystkie znaki specjalne w kodzie Pattern i uciec samemu, dodając "\\" z przodu, czy może to zrobić automagicznie? Czy jestem tak głęboko w problemie, pomijam jakiś oczywisty sposób rozwiązania?

Odpowiedz

2

Co Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\E.*\\Q"));?

To powinno skutkować następującym wzorem:

input: ".+\[a-#$%^&*(" 
quote: \Q".+\[a-#$%^&*("\E 
replace: \Q".+\[a-#$\E.*\Q^&*("\E 

W przypadku, gdy charakter % był pierwszy lub ostatni znak byś dostać \Q\E (jeśli masz tylko wejście % wyrażenie byłoby skończyć się \Q\E.*\Q\E), ale powinno to być prawidłowe wyrażenie.

Aktualizacja:

zapomniałem różnicę pomiędzy replace(...) i replaceAll(...): Parametr zastąpienia w pierwszych jest dosłownym gdy zastąpienie w tym ostatnim jest sama nazwa. Zatem - jak już wspomniano w swoim komentarzu - musisz zadzwonić pod numer Pattern.compile(Pattern.quote(inputText).replaceAll("%", "\\\\E.*\\\\Q")); (zacytuj ukośniki w ciągu i wyrażenie).

Z dokumentacji na String#replaceAll(...):

Zauważ, że ukośniki w ciągu zastępowania może spowodować, że wyniki będą się różnić, niż gdyby były traktowane jako dosłownego odtworzenia łańcucha.

+0

+1 Ale nie jestem pewien, czy dokumentacja dla metody 'quote' gwarantuje *, że ciąg będzie zawsze otoczony przez '\ Q' i' \ E' (mówi tylko "Ta metoda tworzy ciąg, który może używaj do stworzenia Wzorca, który będzie pasował do łańcucha s, jak gdyby był dosłownym wzorem. "). Chociaż w praktyce uważam, że wszystkie obecnie istniejące impedycje Javy wykorzystują do tego celu '\ Q ... \ E'. –

+0

@Thomas przepraszam pytanie początkujących - jaki jest tutaj zwyczaj? Czy mogę skasować moje komentarze po aktualizacji odpowiedzi? –

+0

@pafauk. Hmm, nie jestem pewien, ale jeśli komentarze nie dostarczają żadnych dodatkowych informacji (co moim zdaniem dotyczy naszych komentarzy teraz), usunę je, aby zachować przejrzystość. Zacznę i usuniemy moje poprzednie komentarze. – Thomas

6

myślę, że ten algorytm powinien pracować dla Ciebie:

  • Podział na %
  • Cytat każda część oddzielnie przy użyciu Pattern.quote
  • Dołącz ciąg używając .*
+0

Dzięki! Ładnie i czysto, choć wymaga trochę pracy pamiętając, jeśli na początku i/lub na końcu łańcucha pojawił się%. –

Powiązane problemy