2012-01-06 12 views
12

Sono consapevole del fatto che regEx è comune tra le lingue ... Ma ho problemi con la scrittura della sintassi Java. Ho un'espressione regolare codificata in JS come;Converti espressione regolare Javascript in sintassi Java

if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))   
return true; 

Come scrivere lo stesso in Java?

Ho importato

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

Giusto per aggiungere, da quello che sto cercando è dire \ x è un carattere di escape non valido ..

risposta

27

Change parte anteriore e posteriore '/' caratteri per '"', e quindi sostituire ogni '\' con "\\".

A differenza di Javascript, Perl e altri linguaggi di scripting, Java non ha una sintassi speciale per le regex. Invece, sono (in genere) espressi usando i letterali stringa Java. Ma '\' è il carattere di escape in una stringa letterale Java, quindi ogni '\' nell'espressione regolare originale deve essere preceduto da escape con un secondo '\'. (E se nella regex hai un letterale carattere backslash, finisci con "\\\\" nella stringa letterale Java !!)

Questo è un po 'confuso/scoraggiante per i principianti Java ... ma è del tutto logico. Ricorda che stai usando una stringa letterale Java per esprimere la regex.


Tuttavia, come note @antak, ci sono varie differenze tra i linguaggi regex in Java e Javascript. Quindi, se prendi un'espressione regex di Javascript e la traslochi su Java come sopra, potrebbe non funzionare.

Ecco alcuni riferimenti che riassumono le differenze.

+0

Thx un sacco..Io non ho capito la seconda parte ... sostituisci ogni '\' con '\' ..... Non sono entrambi uguali? – testndtv

+0

@testndtv - Ho detto che "deve essere ** scappato ** con una seconda barra rovesciata". Non ho detto che deve essere sostituito. –

+0

Vorrei che ci fosse un modo per aggiungere risposte ai segnalibri ... aspetta, non importa. Segnalibri. Comunque grazie. – hypd09

3

L'unica cosa che dovete fare è duplicare indietro barre.

Pattern p1 = Pattern.compile("[a-zA-Z]"); 
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]"); 

if (p1.matcher(str).find() && p2.matcher(str).find()) { 
    return true; 
} 
+0

Thx un sacco ... Ricevo un errore di sintassi per la linea if ... – testndtv

+1

@testndtv: Non dire mai che si sta verificando un errore senza mostrare l'errore Messaggio. –

+0

Mancava la seconda chiamata 'find()'; Provalo ora. –

0

Java espressioni regolari sono in primo luogo le stringhe, quindi è necessario iniziare con le virgolette doppie e non /. Inoltre, in java, devi sfuggire allo \ eseguendo due di questi come \\.

Dai un'occhiata al tutorial this da Oracle per ulteriori informazioni.

+1

Non è il motore regex stesso, è il metodo 'matches()' che richiede la regex di consumare l'intera corda, come se fosse ancorata alle due estremità. Il metodo 'find()' esegue il tipo di match più tradizionale, ma non puoi chiamarlo dall'oggetto String come puoi con 'matches()'; devi creare in modo esplicito un oggetto Matcher come [AlexR] (http://stackoverflow.com/a/8754491/20938). –

+0

@AlanMoore: Grazie per avermelo fatto sapere. Ho usato raramente find, ho quasi sempre usato 'matches()'. Ho rimosso quella sezione dalla mia risposta, grazie ancora per i chiarimenti. – npinti

1

Penso che possa essere utile. In Java, abbiamo classi per eseguire javascript da java. qualsiasi pensiero è benvenuto

Problemi correlati