2010-10-05 17 views
11

Należy usunąć wszystkie znaki z podanego ciągu, z wyjątkiem kilku, które powinny pozostać. Jak to zrobić z regexp?Czy w regexp jest operator (!)?

Prosty test: znaki [1, a, *] nie powinny być usuwane, wszystkie inne powinny mieć napis "asdf123 **".

Odpowiedz

22

Istnieje:^w zestawie.

Powinieneś być w stanie zrobić coś takiego:

text = text.replaceAll("[^1a*]", ""); 

Pełna próbki:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String input = "asdf123**"; 
     String output = input.replaceAll("[^1a*]", ""); 
     System.out.println(output); // Prints a1** 
    } 
} 
+2

Nie musisz uciekać przed '*' w klasie znaków. – kennytm

+1

@KennyTM: Ooh, nie wiedziałem o tym. Pozdrawiam, dostosowuję teraz ... –

+0

Nie musisz też uciec od myślnika, jeśli jest na końcu lub na początku klasy postaci. Tak więc [^ * .-] reprezentuje wszystko, co nie jest gwiazdką, kropką lub łącznikiem. :) –

9

Po zastosowaniu wewnątrz [ i ]^ (karetka) to operator not.

Stosowany jest tak:

"[^abc]" 

To dopasuje dowolny znak z wyjątkiem ab lub c.

+3

Kiedy używany * jako pierwszy znak * wewnątrz ... –

1

Istnieje zanegowany kod character class, który może działać w tym wystąpieniu. Możliwość zdefiniowania jednego umieszczając ^ na początku klasy, takie jak:

[^1a\*]

dla konkretnego przypadku.

+0

możesz ned uciec *, powinno być \\ * – Cfreak

+0

Właściwie nie (w regex dialektów, że jestem świadomy, tak), ale mogą. Dodam jednak, że jest to wyraźne. – eldarerathis

+0

@Cfreak: nie, nie musisz (patrz wyżej) –

0

W klasie postać^nie jest. Tak więc pasuje do wszystkich znaków oprócz tych.

0

chcesz dopasować przeciwko wszystkich znaków z wyjątkiem: [asdf123 *], użyj^

0

Nie ma „nie” operator w wyrażeniach regularnych Java jak jest w Perlu.

+0

Czy mówisz o operatorze dopasowywania odwróconego wyrażenia regularnego Perla '! ~'? To nie ma znaczenia, biorąc pod uwagę fakt, że OP dokonuje substytucji, a nie dopasowania. A jeśli * próbował * dopasować znaki, zamiast je zastąpić, musiałby przeprowadzić dopasowanie * pozytywne * dla wyrażeń regularnych, które wykluczają te znaki, jak wskazali inni respondenci. Na przykład w Perlu może to zrobić: 'moje @result = $ s = ~ m/[^ 1a *] +/g;' –