GWT中的正则表达式匹配URL

时间:2010-01-20 02:53:48

标签: java javascript regex gwt

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

您必须使用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,至少对于中等复杂的正则表达式。

答案 1 :(得分:2)

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

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

  

在文字Java字符串中反斜杠   是一个逃脱角色。文字   字符串“\\”是一个反斜杠。在   正则表达式,反斜杠是   也是逃避角色。经常   表达式\\匹配单个   反斜杠。这个正则表达式为   一个Java字符串,变成“\\\\”。那是   右:4个反斜杠以匹配单个   之一。

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

答案 2 :(得分:2)

我不确切知道这会有什么帮助,但这里是您在Javascript中请求的确切功能。我想使用像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,这个正则表达式工作,甚至验证指向localhost:port的站点,其中port是任何数字端口号。