2011-12-25 95 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>");