JavaScript和Java之间的正则表达式模式的差异?

时间:2011-12-25 09:40:11

标签: java javascript regex

在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替换为包含锚标记的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中找不到任何匹配项,即使对于相同的输入字符串也是如此。我是否需要更改模式中的某些内容,或者发生了什么?

2 个答案:

答案 0 :(得分: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>");
}

答案 1 :(得分: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>");