Meta personaggio Java RegEx (.) E punto ordinario?


150

In Java RegEx, come scoprire la differenza tra .(punto) il meta carattere e il punto normale come si usa in qualsiasi frase. Come gestire questo tipo di situazione per gli altri personaggi meta anche come ( *, +, \d, ...)

Risposte:


276

Se vuoi che il punto o altri personaggi con un significato speciale nelle regex siano un personaggio normale, devi evitarlo con una barra rovesciata. Poiché le regex in Java sono normali stringhe Java, è necessario sfuggire alla barra rovesciata stessa, quindi sono necessarie due barre rovesciate, ad es.\\.


1
questa correzione si applica anche a bash
krivar il

18
Essere consapevoli del fatto che l'eventualità di sfuggire alla barra rovesciata dipende da come si sta fornendo la regex. se hardcoded devi usare: "\\." , se si legge da una fonte non elaborata (ad es. file di testo) si usa solo una singola barra rovesciata: \.
Paul,

25

Le soluzioni proposte dagli altri membri non funzionano per me.

Ma ho trovato questo:

per sfuggire a un punto in java regexp write [.]


2
Lo stesso, \\.non ha funzionato per me: si è \.lamentato del fatto che .non è necessario sfuggire, ha \\.fatto pensare che fosse \.invece e ., \\\.e il costruttore ha lanciato un errore, è [.]stata l'unica cosa che ha funzionato.
mithunc

1
@mithunc È strano, \\.all'interno di una stringa letterale ti dà \.qual è ciò di cui il regex ha bisogno per vedere il punto come un punto letterale invece del matcher di qualsiasi carattere.
klaar,

16

Le espressioni regolari in stile Perl (su cui si basa più o meno il motore regex Java) trattano i seguenti caratteri come caratteri speciali:

.^$|*+?()[{\ha un significato speciale al di fuori delle classi di personaggi,

]^-\ha un significato speciale all'interno delle classi di caratteri ( [...]).

Quindi è necessario sfuggire a quei simboli (e solo a quelli) a seconda del contesto (o, nel caso delle classi di caratteri, posizionarli in posizioni dove non possono essere male interpretati).

L'evasione inutile di altri caratteri potrebbe funzionare, ma alcuni motori regex lo considereranno errori di sintassi, ad esempio \_causeranno un errore in .NET.

Alcuni altri porteranno a risultati falsi, ad esempio \<viene interpretato come letterale <in Perl, ma in egrepesso significa "confine di parole".

Quindi scrivi -?\d+\.\d+\$per abbinare 1.50$, -2.00$ecc. E [(){}[\]]per una classe di caratteri che corrisponde a tutti i tipi di parentesi / parentesi graffe / parentesi.

Se è necessario trasformare una stringa di input dell'utente in un modulo sicuro per regex, utilizzare java.util.regex.Pattern.quote.

Ulteriori letture: il blog di Jan Goyvaert RegexGuru sulla fuga di metacaratteri


4

Fuggi dai personaggi speciali con una barra rovesciata. \., \*, \+, \\d, E così via. Se non sei sicuro, puoi sfuggire a qualsiasi carattere non alfabetico, che sia speciale o meno. Vedere javadoc per java.util.regex.Pattern per ulteriori informazioni.


La fuga di caratteri non speciali potrebbe inutilmente funzionare in alcune lingue ma potrebbe fallire in altre, quindi è meglio non prendere l'abitudine.
Tim Pietzcker,

1
Questa domanda riguarda in particolare Java, e docs.oracle.com/javase/6/docs/api/java/util/regex/… dice "Una barra rovesciata può essere utilizzata prima di un carattere non alfabetico indipendentemente dal fatto che quel carattere sia parte di un costrutto senza caratteri di escape ".
Christoffer Hammarström,

2

Ecco il codice che puoi copiare direttamente incolla:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

E se erroneamente ci sono spazi lasciati prima o dopo "." in tali casi? È sempre buona prassi considerare anche quegli spazi.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Qui, \\ s * è lì per considerare gli spazi e darti solo le stringhe divise richieste.


1

Volevo abbinare una stringa che termina con ". *" Per questo ho dovuto usare quanto segue:

"^.*\\.\\*$"

Un po 'sciocco se ci pensi: D Ecco cosa significa. All'inizio della stringa può esserci qualsiasi carattere zero o più volte seguito da un punto "." seguito da una stella (*) alla fine della stringa.

Spero che questo sia utile per qualcuno. Grazie per il contraccolpo a Fabian.


Basta usare "\\.\\*$"allora. Non è necessario abbinare l'inizio della stringa se non ti interessa.
Ofide

Sì hai ragione. Ad essere sincero, non ricordo il caso d'uso per questo: /
Atspulgs,

Non è stato davvero di aiutarti ma di aiutare gli altri a guardare il tuo post: P
Ophidian,

0

Se vuoi terminare controlla se la tua frase termina con ". ", Allora devi aggiungere [\. \ ] $ Alla fine del tuo schema.


0

Sto facendo un array di base in JGrasp e ho scoperto che con un metodo accessor per un array char [] [] utilizzare ('.') Per posizionare un singolo punto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.