Différences dans les modèles regex entre JavaScript et Java?

Dans JavaScript, j'ai le suivant:

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

Il remplace toutes les URL dans la chaîne de saisie avec une version de l'URL qui a une étiquette d'ancrage enroulée autour de celle-ci pour la transformer en un lien. J'essaie de dupliquer cette fonctionnalité en Java avec la fonction suivante:

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

Cependant, bien qu'il fonctionne bien en JavaScript, il ne trouve aucune correspondance en Java, même pour la même chaîne d'entrée. Dois-je changer quelque chose dans le modèle, ou ce qui se passe?

Vous devez vous débarrasser des barrages autour de l'expression et le i à la fin pour l'exemple Java. Vous pouvez spécifier le drapeau i séparément. Alors JavaScript /blarg/i serait transformé en "(?i)blarg" .

Votre code deviendrait quelque chose comme:

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

C'est normal: le Pattern de Java ne fonctionne pas de cette façon.

Votre regex est compatible avec les deux moteurs, mais vous ne spécifiez pas les modificateurs de cette façon avec Java.

Faire:

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