Различия в шаблонах регулярных выражений между JavaScript и Java?

в JavaScript, у меня есть следующие:

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

Он заменяет все URL-адреса во входной строке версией URL-адреса с тегом привязки, обернутым вокруг него, чтобы превратить его в ссылку. Я пытаюсь дублировать эту функциональность в Java со следующей функцией:

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

однако, хотя он отлично работает в JavaScript, он не находит совпадений в Java, даже для той же входной строки. Нужно ли мне что-то менять в схеме, или что происходит о?

2 ответов


вам нужно избавиться от косых черт вокруг выражения и i в конце для примера Java. Вы можете указать i флаг отдельно. Итак, JavaScript /blarg/i станут "(?i)blarg".

ваш код станет чем-то вроде:

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

это нормально: Java Pattern не работает таким образом.

ваше регулярное выражение совместимо с обоими движками, однако вы не указываете модификаторы таким образом с 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=\"\"></a>");