JavaScript和Java中正则表达式模式的区别是什么?

6
在JavaScript中,我有以下代码:
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>"); 
}

它将输入字符串中的所有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=\"$1\">$1</a>");
}

然而,尽管它在JavaScript中运行良好,但在Java中没有找到任何匹配项,即使输入字符串相同。我需要在模式中更改一些内容,还是出了什么问题?


1
抱歉离题了,但使用正则表达式解析HTML标签是不安全的,而且有点丑陋。 - Dmitry Vershinin
2个回答

2
你需要去掉Java示例中表达式周围的斜杠和末尾的i。你可以单独指定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=\"$1\">$1</a>");
}

2

这是正常的情况:Java的Pattern不会按照这种方式工作。

您的正则表达式与两个引擎兼容,但是在Java中不应该以这种方式指定修饰符。

请执行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接