GWT中的正则表达式匹配URL

我实现了Pattern类,如下所示: http : //www.java2s.com/Code/Java/GWT/ImplementjavautilregexPatternwithJavascriptRegExpobject.htm

我想使用以下正则表达式匹配我的字符串中的url:

(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))? 

不幸的是,Java编译器当然无法解析该字符串,因为它不使用有效的转义序列(因为上面在技术上是JavaScript的url模式,而不是Java)

在一天结束时,我正在寻找一个正则表达式模式,它将在Java中编译并在JavaScript中正确执行。

您将不得不使用JSNI在Javascript中执行正则表达式评估部分。 如果您使用转义的反斜杠编写正则表达式,那么它将被转换为Javascript,并且显然是无效的。 认为它将在托管或开发模式下工作,因为它仍然运行Java字节码,但不在编译的应用程序上。

一个简单的JSNI示例,用于测试给定字符串是否为有效URL:

 // Java method public native boolean isValidUrl(String url) /*-{ var pattern = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; return pattern.test(url); }-*/; 

Java和Javascript正则表达式引擎之间可能存在其他不一致之处,因此最好将其完全卸载到Javascript,至少对于中等复杂的正则表达式。

模式本身看起来很好,但我想,这是因为反斜杠转义。

请查看http://www.regular-expressions.info/java.html

在字面Java字符串中,反斜杠是一个转义字符。 文字字符串“\\”是一个反斜杠。 在正则表达式中,反斜杠也是转义字符。 正则表达式\\匹配单个反斜杠。 这个作为Java字符串的正则表达式变为“\\\\”。 这是正确的:4个反斜杠匹配单个。

因此,如果您在java中重用Javascript正则表达式,则需要将\替换为\\ ,反之亦然。

我不确切知道这有什么用,但这里是你在Javascript中请求的确切function。 我想使用像Anurag这样的JSNI会有所帮助。

 var urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; function isValidURL(url) { urlPattern = "^" + urlPattern + "$"; var regex = new RegExp(urlPattern); return regex.test(url); } 

就像@ S.Mark所说的那样,我基本上采用了“java”方式在Javascript中进行正则表达式。

在Java中,您只需按以下方式完成(请参阅表达式是如何相同的)。

 String urlPattern = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?"; 

希望这可以帮助。 PS,这个正则表达式工作,甚至validation指向localhost:port的站点,其中port是任何数字端口号。