2010-04-09 16 views
5

mam tego regex:zastąpić znaki, które nie są zgodne z tymi w regex

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

mogę sprawdzić, czy mój string pasuje do tego wyrażenia regularnego, a jeśli nie, chcę, aby zastąpić wszystkie znaki, które nie są tutaj, z "_".

Próbowałem tak:

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

ale to nie działa ..., więc w 2. regex „~” wydaje się nie pominąć następujące znaki.

Każdy pomysł?

Odpowiedz

8

Masz kilka problemów w regex (patrz Pattern class dla zasad):

  • wewnątrz klasy postaci | ma szczególne znaczenie i powinien zostać usunięty bez zastąpienia w twoim przypadku (chyba, że ​​chcesz swoją postać klasa zawierająca literalny znak |).
  • Podobnie nie musisz uciec od /, _ i + w klasie postaci.
  • - tylko musi być ucieczka, jeśli nie jest to ostatni znak
  • ~ nie ma też szczególne znaczenie w klasy postaci to właśnie oznacza się
  • będziesz chciał użyć ^ negować treść grupy znaków.

Można również pominąć pierwszy matches() czek, jako wezwanie replaceAll() zwróci niezmodyfikowanej String jeśli nic i tak pasuje. Przechowywanie (i drugie wyrażenie regularne) służy jedynie wprowadzeniu innego miejsca, w którym mogą się ukrywać błędy (na przykład możesz przypadkowo zaktualizować jedno wyrażenie regularne, ale nie drugie).

+0

Wielkie dzięki za jasne wyjaśnienie. –

4

Spróbuj:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

Podstawowym problemem jest to, że masz wkładacie niepotrzebnych | s do swojego wzoru. Mają inne znaczenie. Możesz także znacznie uprościć swoje wyrażenie, używając \w, co oznacza "znak słowny", oznaczający litery (wielkie lub małe litery), cyfry lub podkreślenie i jest tożsamy ​​z [A-Za-z0-9_].

Musisz także zrozumieć, jak działa ucieczka. Występuje sznur napisu Java, dlatego wstawiono \\, aby wstawić jeden ukośnik odwrotny do wzorca. Ale jest również ucieczka od regex. Na przykład: \n to znak nowego łańcucha Java, a \\n to kolejność wstawiania \n do wzorca w celu wyszukania znaku nowego wiersza.

Masz dwie dogodne możliwości ucieczki kilka tekstem:

  1. można użyć \Q...\E.Wszystko między \Q i \E zostało usunięte; i

  2. Możesz użyć Pattern.quote(), aby podać dowolny ciąg znaków.

Gdzie trzeba uciec z pewnych sekwencji w wyrażeniach regularnych jest kontekstualna. Na przykład - musi być tylko zmieniony, jeśli można go pomylić z wskazaniem zakresu. [a-z] jest małymi literami. [a\-z] jest jednym z a, - lub lub . Ale możesz zrobić -[a-z], aby wskazać łącznik, a następnie małą literę. Uwaga: nie trzeba uciec od pierwszego łącznika.

+0

Myślę, że musisz uciec '-' –

Powiązane problemy