2009-04-24 13 views
14

La mia comprensione è che l'implementazione di Java di espressioni regolari è basata su Perl. Tuttavia, nell'esempio seguente, se eseguo la stessa regex con la stessa stringa, Java e Perl restituiscono risultati diversi.Perché le espressioni regolari in Java e Perl si comportano diversamente?

Ecco l'esempio Java:

public class RegexTest { 
    public static void main(String args[]) { 
     String sentence = "This is a test of regular expressions."; 
     System.out.println(sentence.matches("\\w") ? "Matches" : "Doesn't match"); 
    } 
} 

Ciò restituisce: Non corrisponde

Ecco l'esempio Perl:

my $sentence = 'This is a test of regular expressions.'; 
print ($sentence =~ /\w/ ? "Matches" : "Doesn't match") . "\n"; 

Ciò restituisce: Partite

Per me, il risultato Perl ha senso. Cerca una corrispondenza per un carattere a parola singola. Non capisco perché Java non lo consideri una corrispondenza. Qual è la ragione della differenza?

risposta

31

Il metodo Java matches sta testando se la regex corrisponde all'intero String. Per verificare se una regex può essere trovata ovunque in una stringa, creare un Matcher e utilizzare il suo metodo find.

10

Inoltre, la sintassi regex Perl è NON la sintassi di Java Regex.

Non si applica necessariamente in questo caso, ma questa è una risposta più alla tua domanda più generale.

Java ha una sintassi di espressione regolare nota come "PCRE", ovvero: compatibile Perl.

Questo nome è comunque grossolanamente fuorviante, perché c'è davvero molto poco che è veramente compatibile Perl.

Per esempio, espressioni regolari Perl permettere l'esecuzione di codice nell'espressione stessa, e un sacco di altri operatori avanzati, e un po 'la sintassi sono diversi in Perl come sono in altre lingue (ad esempio: molte lingue usano \> e \< come limite di una parola marcatori, ma Perl usa semplicemente '\ b')

Dedica alcuni minuti alla lettura di alcuni degli PerlRe Documentation e scoprirai un sacco di trucchi fantastici che il motore di espressioni regolari di Perl può fare che nessun altro sembra fare.

+2

PCRE era compatibile con perl nei primi giorni di perl versione 5, oppure era perl v4. Non sono sicuro. Nel frattempo la regex di perl ha fatto progressi molto. –

+0

+1 per rispondere alla domanda più generale (quella del titolo). Mi piacerebbe aggiungere che il libro "Mastering Regular Expressions" di Jeffrey Friedl è ottimo per comprendere le somiglianze e le differenze tra gli aromi regex comuni. – Jonik

Problemi correlati