2013-01-03 44 views
70

Sto tentando di creare un'applicazione che corrisponde a un modello di messaggio con un messaggio che un utente sta tentando di inviare. Sto usando Java regex per la corrispondenza del messaggio. Il modello/messaggio può contenere caratteri speciali.Elenco di tutti i caratteri speciali che devono essere sottoposti a escape in un'espressione regolare

Come posso ottenere l'elenco completo di caratteri speciali che devono essere sfuggiti affinché la mia espressione regolare funzioni e combaci nei casi massimi possibili?

Esiste una soluzione universale per l'escape di tutti i caratteri speciali nella regex di Java?

risposta

59

Potete guardare il Javadoc della classe Pattern: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

avete bisogno di sfuggire qualsiasi carattere elencato lì, se si desidera che il carattere regolare e non il significato speciale.

Come soluzione forse più semplice, è possibile inserire il modello tra \ Q e \ E - tutto ciò che si trova tra di loro è considerato come sfuggito.

+31

Se trovi \ Q e \ E difficile da ricordare, puoi usare invece Pattern.quote ("...") – mkdev

+10

Vorrei che li avessi effettivamente indicati –

+0

Perché, @AleksandrDubinsky? – Sorin

0

Non sono sicuro di comprendere appieno la tua domanda, ma penso che si dovrebbe guardare a Matcher.quoteReplacement()

+1

supponiamo che sto cercando di corrispondere. (Punto) in regex.Credo che debba essere sfuggito perché ha qualche altro significato nella regex. Quindi ho bisogno di sapere tutti i personaggi che devono essere sfuggiti. –

+0

.......... wat? – mkoryak

+0

Siamo spiacenti, questo è stato pubblicato per errore! Dove posso trovare l'elenco completo dei caratteri di escape in regex java? –

1

sull'altro lato della medaglia, è necessario utilizzare regex "non-char" che assomiglia a questo se i caratteri speciali = allChars - numero - ABC - spazio nel contesto dell'app.

String regepx = "[^\\s\\w]*"; 
5

Su @ suggerimento di Sorin dei documenti modello Java, sembra caratteri di fuga sono almeno:

\.[{(*+?^$| 
+4

'String escaped = regexString.replaceAll (" ([\\\\\\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\]] ", "\\\\ $ 1"); ' – fracz

+2

') 'deve anche essere scappato, e a seconda che tu sia all'interno o all'esterno di una classe di caratteri, ci possono essere più caratteri da sfuggire, nel qual caso' Pattern.quote' fa un buon lavoro a sfuggire a una stringa per l'uso sia all'interno che all'esterno della classe di caratteri. – nhahtdh

54
  • caratteri Java che devono essere sfuggito nelle espressioni regolari sono:
    \.[]{}()*+-?^$|
  • Due delle parentesi di chiusura (] e }) devono essere sfuggite solo dopo aver aperto lo stesso tipo di staffa.
  • Nel [] -bracket alcuni caratteri (come + e -) talvolta funzionano senza uscita.
+0

Esiste un modo per non scappare ma consentire quei personaggi? – Dominika

+0

Scappare un personaggio significa consentire al personaggio invece di interpretarlo come un operatore. –

+2

'' '' all'interno '[]' non può sempre funzionare poiché viene utilizzato per definire intervalli. È più sicuro evaderlo. Ad esempio, i pattern '[-]' e '[-)]' corrispondono alla stringa '-' ma non a' [(-)] '. –

12

Secondo la pagina String Literals/Metacharacters di documentazione, sono:

<([{\^-=$!|]})?*+.>

Inoltre sarebbe bello avere quella lista refereed da qualche parte nel codice, ma non so dove che potrebbe essere. ..

+9

'String escape = tnk.replaceAll (" [\\ <\\ (\\ [\\ {\\\\\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ } \\) \\? \\ * \\ + \\. \\>] "," \\\\ $ 0 ");' – marbel82

+0

Il modello javadoc dice che è un errore utilizzare un backslash prima di qualsiasi carattere alfabetico che non denota un costrutto di escape, ** ma ** una barra retroversa può essere usata prima di un carattere non alfabetico indipendentemente dal fatto che quel personaggio sia parte di un costrutto senza caratteri di escape. Quindi una regex molto più semplice sarà sufficiente: 's.replaceAll (" [\\ W] "," \\\\ $ 0 ")' dove '\ W' indica i caratteri non di parole. –

11

Per uscire si potrebbe utilizzare questo da Java 1.5:

Pattern.quote("$test"); 

Potrete abbinare exacty la parola $test

3

Combinando quello che tutti dicevano, propongo quanto segue, per mantenere l'elenco dei caratteri speciali per RegExp chiaramente indicato nella propria stringa, e per evitare di dover cercare di visivamente analizzare migliaia di "\\"'S. Questo sembra funzionare abbastanza bene per me:

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>"; 
final String regExSpecialCharsRE = regExSpecialChars.replaceAll(".", "\\\\$0"); 
final Pattern reCharsREP = Pattern.compile("[" + regExSpecialCharsRE + "]"); 

String quoteRegExSpecialChars(String s) 
{ 
    Matcher m = reCharsREP.matcher(s); 
    return m.replaceAll("\\\\$0"); 
} 
Problemi correlati