Различия в шаблонах регулярных выражений между 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>");