2012-05-08 8 views
6

Ho un'espressione regolare in Python e sto cercando di convertire in Java. Sembra che ci sia una sottile differenza nelle implementazioni.Differenze nella sintassi RegEx tra Python e Java

Il RegEx sta cercando di abbinare un altro ex reg. La RegEx in questione è:

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

Una delle corde che sta avendo problemi a dire: /\s+/;

Il reg ex non dovrebbe essere corrispondente al fine ;. In Python il RegEx funziona correttamente (e non corrisponde alla fine ;, ma in Java lo fa includere il ;

The Question (s):.

  1. Che cosa posso fare per ottenere questo RegEx lavorare in Java?
  2. sulla base di quello che ho letto here ci dovrebbe essere alcuna differenza per questo RegEx. c'è da qualche parte un elenco di differenze tra le implementazioni RegEx in Python vs Java?
+4

Potrebbe pubblicare il codice Python e Java per il tuo partner? Puoi chiarire cosa intendi con "Questo accade in Python ma non in Java"? Quale lingua corrisponde alla stringa e quale non è? – happydave

+0

Sembra che l'espressione regolare corrisponda a un regex JavaScript letterale, giusto? Funziona in Python ma tu vuoi eseguirlo in Java? –

+0

@happydave - chiarito la domanda di cui sopra. – Vineet

risposta

10

Java non analizza le espressioni regolari nello stesso modo di Python per un piccolo insieme di casi. In questo caso particolare, i nidificati n. [ causavano problemi. In Python non è necessario sfuggire a qualsiasi nidificazione n. [ ma è necessario farlo in Java.

regex originale (per Python):

/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B) 

regex fisso (per Java e Python):

/(\\.|[^\[/\\\n]|\[(\\.|[^\]\\\n])*\])+/([gim]+\b|\B) 
5

L'ovvio d ifference b/w Java e Python è che in Java è necessario sfuggire a molti caratteri.

Inoltre, si sono probabilmente in esecuzione in una mancata corrispondenza tra i metodi di corrispondenza, non una differenza nel reale notazione di espressione regolare:

Data la Java

String regex, input; // initialized to something 
Matcher matcher = Pattern.compile(regex).matcher(input); 
  • matcher.matches() (anche Pattern.matches(regex, input)) corrisponde a Java l'intera stringa. Non ha un equivalente diretto in Python. Lo stesso risultato può essere ottenuto utilizzando re.match(regex, input) con un regex che termina con $.
  • Java matcher.find() e Python re.search(regex, input) corrispondono a qualsiasi parte della stringa.
  • Java matcher.lookingAt() e Python re.match(regex, input) corrispondono all'inizio della stringa.

Per maggiori dettagli leggere anche la documentazione di Java di Matcher e confrontare al Python documentation.

Dal momento che lei ha detto che non è il problema, ho deciso di fare un test: http://ideone.com/6w61T Sembra java sta facendo esattamente quello che avete bisogno di (gruppo 0, l'intera partita, non contiene il ;) . Il tuo problema è altrove.

+0

Sì, i caratteri sono stati scappati. Ottimo punto sulla differenza nei metodi - non sembra che questo sia il problema qui (l'ho verificato - sembra qualcosa di sbagliato con il reg ex). Scavando un po 'di più in (http://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html) sembra che ci sia * un * equivalente per il 're.match di Python 'in Java - sembra essere' matcher.lookingAt'. – Vineet

+0

@Vineet Notato e modificato. L'ho anche testato e il tuo problema sembra essere altrove. – trutheality

Problemi correlati