Benvenuti alle espressioni regolari in Java. È anche chiamato Regex in Java. Quando ho iniziato a programmare, le espressioni regolari in java erano un incubo per me. Questo tutorial mira ad aiutarti a padroneggiare le espressioni regolari in Java. Tornerò anche qui per rinfrescare la mia conoscenza delle espressioni regolari in Java.
Espressioni Regolari in Java
L’espressione regolare in Java definisce un modello per una stringa. Le espressioni regolari possono essere utilizzate per cercare, modificare o manipolare il testo. Un’espressione regolare non è specifica del linguaggio, ma differiscono leggermente per ogni linguaggio. Le espressioni regolari in Java sono più simili a Perl. Le classi Regex di Java sono presenti nel pacchetto
java.util.regex
che contiene tre classi:
- Pattern: L’oggetto
Pattern
è la versione compilata dell’espressione regolare. La classe Pattern non ha alcun costruttore pubblico e utilizziamo il suo metodo statico pubblicocompile
per creare l’oggetto pattern passando l’argomento dell’espressione regolare. - Matcher:
Matcher
è l’oggetto motore di regex di Java che corrisponde al modello di stringa di input con l’oggetto modello creato. La classe Matcher non ha alcun costruttore pubblico e otteniamo un oggetto Matcher usando il metodomatcher
dell’oggetto modello, che prende la stringa di input come argomento. Successivamente, utilizziamo il metodomatches
che restituisce un risultato booleano in base al fatto che la stringa di input corrisponda o meno al modello regex. - PatternSyntaxException:
PatternSyntaxException
viene lanciata se la sintassi dell’espressione regolare non è corretta.
Diamo un’occhiata a un esempio di programma Java Regex.
package com.journaldev.util;
import java.util.regex.*;
public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".xx.");
Matcher matcher = pattern.matcher("MxxY");
System.out.println("Input String matches regex - "+matcher.matches());
// cattiva espressione regolare
pattern = Pattern.compile("*xx*");
}
}
Quando eseguiamo questo programma di esempio Java regex, otteniamo l’output seguente.
Input String matches regex - true
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.sequence(Pattern.java:2090)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at com.journaldev.util.PatternExample.main(PatternExample.java:13)
Dato che l’espressione regolare di Java ruota attorno alla stringa, la classe String è stata estesa in Java 1.4 per fornire un metodo matches
che effettua la corrispondenza del modello regex. Internamente utilizza le classi regex di Java Pattern
e Matcher
per elaborare i dati, riducendo ovviamente le linee di codice. La classe Pattern
contiene anche il metodo matches
che prende come argomenti una regex e una stringa di input, restituendo un risultato booleano dopo averle confrontate. Pertanto, il seguente codice funziona correttamente per la corrispondenza di una stringa di input con un’espressione regolare in Java.
String str = "bbb";
System.out.println("Using String matches method: "+str.matches(".bb"));
System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));
Quindi, se il tuo requisito è solo verificare se la stringa di input corrisponde al modello, dovresti risparmiare tempo e righe di codice utilizzando il semplice metodo di confronto di stringhe. Dovresti utilizzare le classi Pattern e Matches solo quando è necessario manipolare la stringa di input o è necessario riutilizzare il modello. Nota che il modello definito dalla regex viene applicato alla stringa da sinistra a destra e una volta che un carattere di origine è utilizzato in una corrispondenza, non può essere riutilizzato. Ad esempio, la regex “121” si abbinerà a “31212142121” solo due volte come “_121____121”.
Espressione Regolare in Java – simboli di corrispondenza comuni
Regular Expression | Description | Example |
---|---|---|
. | Matches any single character | (“…”, “a%”) – true(“…”, “.a”) – true (“…”, “a”) – false |
^aaa | Matches aaa regex at the beginning of the line | (“^a.c.”, “abcd”) – true (“^a”, “ac”) – false |
aaa$ | Matches regex aaa at the end of the line | (“…cd$”, “abcd”) – true(“a$”, “a”) – true (“a$”, “aca”) – false |
[abc] | Can match any of the letter a, b or c. [] are known as character classes. | (“^[abc]d.”, “ad9”) – true(“[ab].d$”, “bad”) – true (“[ab]x”, “cx”) – false |
[abc][12] | Can match a, b or c followed by 1 or 2 | (“[ab][12].”, “a2#”) – true(“[ab]…[12]”, “acd2”) – true (“[ab][12]”, “c2”) – false |
[^abc] | When ^ is the first character in [], it negates the pattern, matches anything except a, b or c | (“[^ab][^12].”, “c3#”) – true(“[^ab]…[^12]”, “xcd3”) – true (“[^ab][^12]”, “c2”) – false |
[a-e1-8] | Matches ranges between a to e or 1 to 8 | (“[a-e1-3].”, “d#”) – true(“[a-e1-3]”, “2”) – true (“[a-e1-3]”, “f2”) – false |
xx | yy | Matches regex xx or yy |
Meta-caratteri in Java Regex
Abbiamo alcuni meta-caratteri nella regex di Java, sono come shortcode per modelli di corrispondenza comuni.
Regular Expression | Description |
---|---|
\d | Any digits, short of [0-9] |
\D | Any non-digit, short for [^0-9] |
\s | Any whitespace character, short for [\t\n\x0B\f\r] |
\S | Any non-whitespace character, short for [^\s] |
\w | Any word character, short for [a-zA-Z_0-9] |
\W | Any non-word character, short for [^\w] |
\b | A word boundary |
\B | A non word boundary |
Ci sono due modi per utilizzare i meta-caratteri come caratteri ordinari nelle espressioni regolari.
- Precedere il meta-carattere con una barra rovesciata (\).
- Mantenere il meta-carattere tra \Q (che inizia la citazione) e \E (che la termina).
Espressioni regolari in Java – Quantificatori
I quantificatori Regex di Java specificano il numero di occorrenze di un carattere da confrontare.
Regular Expression | Description |
---|---|
x? | x occurs once or not at all |
X* | X occurs zero or more times |
X+ | X occurs one or more times |
X{n} | X occurs exactly n times |
X{n,} | X occurs n or more times |
X{n,m} | X occurs at least n times but not more than m times |
I quantificatori Regex di Java possono essere utilizzati anche con classi di caratteri e gruppi di cattura. Ad esempio, [abc]+ significa – a, b o c – una o più volte. (abc)+ significa il gruppo “abc” una o più volte. Discuteremo ora dei Gruppi di cattura.
Espressioni regolari in Java – Gruppi di cattura
I gruppi di cattura delle espressioni regolari in Java vengono utilizzati per trattare più caratteri come un’unica unità. Puoi creare un gruppo usando ()
. La porzione di stringa di input che corrisponde al gruppo di cattura viene salvata in memoria e può essere richiamata utilizzando il Riferimento indietro. Puoi utilizzare il metodo matcher.groupCount
per scoprire il numero di gruppi di cattura in un modello regex di Java. Ad esempio, ((a)(bc)) contiene 3 gruppi di cattura – ((a)(bc)), (a) e (bc). Puoi utilizzare il Riferimento indietro nell’espressione regolare con una barra rovesciata (\) e quindi il numero del gruppo da richiamare. I gruppi di cattura e i riferimenti indietro possono essere confusionari, quindi cerchiamo di capire questo con un esempio.
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false
Nel primo esempio, durante l’esecuzione il primo gruppo di acquisizione è (\w\d) che si valuta come “a2” quando viene abbinato alla stringa di input “a2a2” e salvato in memoria. Quindi \1 si riferisce a “a2” e quindi restituisce true. Per lo stesso motivo, la seconda affermazione stampa false. Cerca di capire questo scenario per le affermazioni 3 e 4 da solo. 🙂 Ora esamineremo alcuni importanti metodi delle classi Pattern e Matcher.
- Possiamo creare un oggetto Pattern con dei flag. Ad esempio
Pattern.CASE_INSENSITIVE
abilita il matching senza distinzione tra maiuscole e minuscole. - La classe Pattern fornisce anche il metodo
split(String)
che è simile al metodosplit()
della classe String. - Il metodo
toString()
della classe Pattern restituisce la stringa di espressione regolare da cui è stata compilata questa pattern. - Le classi Matcher hanno metodi di indice
start()
eend()
che indicano precisamente dove è stata trovata la corrispondenza nella stringa di input. - La classe Matcher fornisce anche metodi di manipolazione delle stringhe come
replaceAll(String replacement)
ereplaceFirst(String replacement)
.
Esaminiamo questi metodi di regex java in un semplice programma di esempio.
package com.journaldev.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
// utilizzando pattern con flags
Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABcabdAb");
// utilizzando i metodi find(), group(), start() e end() di Matcher
while (matcher.find()) {
System.out.println("Found the text \"" + matcher.group()
+ "\" starting at " + matcher.start()
+ " index and ending at index " + matcher.end());
}
// utilizzando il metodo split() di Pattern
pattern = Pattern.compile("\\W");
String[] words = pattern.split("one@two#three:four$five");
for (String s : words) {
System.out.println("Split using Pattern.split(): " + s);
}
// utilizzando i metodi replaceFirst() e replaceAll() di Matcher
pattern = Pattern.compile("1*2");
matcher = pattern.matcher("11234512678");
System.out.println("Using replaceAll: " + matcher.replaceAll("_"));
System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));
}
}
L’output del programma di esempio di regex java sopra è.
Found the text "AB" starting at 0 index and ending at index 2
Found the text "ab" starting at 3 index and ending at index 5
Found the text "Ab" starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678
Ecco tutto per le espressioni regolari in Java. Le espressioni regolari in Java sembrano difficili all’inizio, ma se ci lavori per un po’ di tempo, è facile impararle e usarle.
Puoi controllare il codice completo e altri esempi di espressioni regolari dal nostro Repository GitHub.
Source:
https://www.digitalocean.com/community/tutorials/regular-expression-in-java-regex-example