2011-12-25 122 views
5

在JavaScript中,我有以下几点:JavaScript和Java之间的正则表达式模式的差异?

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中的任何比赛,即使是相同的输入字符串。我是否需要改变模式中的某些内容,或者发生了什么?

+1

对不起,offtopic,但使用正则表达式解析HTML标记为不安全和EMM ..难看。 – 2016-09-07 07:41:33

回答

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

谢谢!这工作完美! – 2011-12-25 09:52:24

1

这是正常现象: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>");