2011-12-25 17 views
5

In JavaScript, ho il seguente:Differenze nei modelli regex tra JavaScript e Java?

function replaceURLWithHTMLLinks(text) { 
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; 
    return text.replace(exp,"<a href='$1'>$1</a>"); 
} 

Esso sostituisce tutti gli URL nella stringa di input con una versione del URL che ha un tag di ancoraggio avvolto attorno ad esso per trasformarlo in un link. Sto cercando di duplicare questa funzionalità in Java con la seguente funzione:

private String replaceURLWithHTMLLinks(String text) { 
    String pattern = "/(\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/i"; 
    return text.replaceAll(pattern, "<a href=\"$1\">$1</a>"); 
} 

Tuttavia, mentre funziona bene in JavaScript non trova nessuna corrispondenza in Java, anche per la stessa stringa di input. Devo cambiare qualcosa nel modello o cosa sta succedendo?

+1

Scusate offtopic, ma usando espressioni regolari per analizzare i tag HTML non è sicuro e emm .. brutto. –

risposta

2

È necessario eliminare le barre attorno all'espressione e lo i alla fine per l'esempio Java. È possibile specificare separatamente il flag i. Pertanto, lo /blarg/i di JavaScript verrà convertito in "(?i)blarg".

Il tuo codice sarebbe diventato qualcosa di simile:

private String replaceURLWithHTMLLinks(String text) { 
    String pattern = "(?i)(\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])"; 
    return text.replaceAll(pattern, "<a href=\"$1\">$1</a>"); 
} 
+0

Grazie! Ha funzionato perfettamente! –

1

che è normale: di Java Pattern non funziona in questo modo.

L'espressione regolare è compatibile con entrambi i motori, tuttavia non si specificano in questo modo i modificatori con Java.

Do:

Pattern pattern = Pattern.compile("\\b(https?|ftp|file):\\/\\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])", Pattern.CASE_INSENSITIVE); 
retrun pattern.matcher(text).replaceAll("<a href=\"$1\">$1</a>"); 
Problemi correlati