2011-12-25 17 views
5

En JavaScript, Tengo el siguiente:Diferencias en los patrones de expresiones regulares entre JavaScript y 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>"); 
} 

Sustituye a todas las URL en la cadena de entrada con una versión de la URL que tiene una etiqueta de ancla envuelto alrededor de él para convertirlo en un enlace. Estoy tratando de duplicar esta funcionalidad en Java con la siguiente función:

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>"); 
} 

Sin embargo, aunque funciona bien en JavaScript no encuentra ninguna coincidencia en Java, incluso para la misma cadena de entrada. ¿Debo cambiar algo en el patrón, o qué está pasando?

+1

Lo siento por offtopic, pero el uso de expresiones regulares para analizar las etiquetas HTML no es seguro y emm .. fea. –

Respuesta

2

Debe deshacerse de las barras alrededor de la expresión y i al final para el ejemplo de Java. Puede especificar el indicador i por separado. Así que JavaScript /blarg/i se convertiría en "(?i)blarg".

Su código se convertiría en algo como:

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

¡Gracias! Eso funcionó perfectamente! –

1

Eso es normal: Java Pattern no funciona de esta manera.

Su regex es compatible con ambos motores, sin embargo, no especifica modificadores de esta manera 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>"); 
Cuestiones relacionadas