2010-10-05 9 views
11

Devo rimuovere tutti i caratteri dalla stringa specificata eccetto per alcuni che dovrebbero essere lasciati. Come farlo con regexp?C'è un operatore non (!) In regexp?

semplice test: caratteri [1, a, *] non dovrebbe essere rimosso, tutti gli altri dovrebbero da stringa "asdf123 **".

risposta

22

C'è:^in un set.

Si dovrebbe essere in grado di fare qualcosa di simile:

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

campione intero:

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

Non è necessario sfuggire a '*' in una classe di caratteri. – kennytm

+1

@KennyTM: Ooh, non lo sapevo. Cheers, aggiustando ora ... –

+0

Inoltre non è necessario sfuggire a un trattino se è alla fine o all'inizio di una classe di caratteri. Quindi [^ * .-] rappresenta tutto ciò che non è un asterisco, un punto o un trattino. :) –

9

Se utilizzato all'interno di [ e ] il ^ (cursore) è l'operatore not.

E 'utilizzato in questo modo:

"[^abc]" 

che corrisponde a qualsiasi carattere ad eccezione di ab o c.

+3

Quando viene utilizzato * come primo carattere * dentro ... –

1

C'è un negata character class, che potrebbe funzionare per questa istanza. È possibile definire uno mettendo ^ all'inizio della classe, come ad esempio:

[^1a\*]

per il vostro caso specifico.

+0

ned per sfuggire al *, dovrebbe essere \\ * – Cfreak

+0

In realtà non lo fai (nei dialetti regex che io sappia, in ogni caso), si ma può. Lo aggiungerò per essere esplicito, comunque. – eldarerathis

+0

@Cfreak: no non lo fai (vedi sopra) –

0

In una classe di caratteri del^non è. Quindi

[^1a\*] corrisponderebbe a tutti i caratteri eccetto quelli.

0

si desidera far corrispondere contro tutti i personaggi tranne: [asdf123 *], utilizzare^

0

Non c'è nessun operatore "non" in Java espressioni regolari come non c'è in Perl.

+0

Stai parlando dell'operatore di corrispondenza regex invertita di Perl '! ~'? Questo non è davvero rilevante, dato che l'OP sta facendo una sostituzione, non una partita. E se lui * cercasse * di abbinare i personaggi anziché sostituirli, avrebbe bisogno di fare una corrispondenza * positiva * per un'espressione regolare che esclude quei caratteri, come hanno sottolineato gli altri rispondenti. Ad esempio, in Perl potrebbe fare questo: 'my @result = $ s = ~ m/[^ 1a *] +/g;' –