GWT中用于匹配URL的正则表达式

3
我根据以下链接实现了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中正确执行的正则表达式模式。

3个回答

9
您需要使用JSNI来执行Javascript中的正则表达式评估部分。如果您使用转义后的反斜杠编写正则表达式,那么它将按原样转换为Javascript并显然无效。虽然在Hosted或Dev模式下仍在运行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上会更好。


在我发布了这个之后,我意识到这可能是更好的选择。 - Kyle Hayes

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 所说的那样,我基本上采用了在 Javascript 中采用“java”方式进行正则表达式的方法。

在 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})*)?";

希望这可以帮助到您。顺便说一句,这个正则表达式可以工作并验证指向 localhost:port 的站点,其中端口是任意数字端口号。

所有这些答案都非常出色,我非常感谢你们的帮助。业务规则是允许用户在文本中使用URL,他们可以为某些事情输入注释。然后我们会检查并将链接转换为超链接(仅简单地将它们包装在锚标记中),剥离其他HTML,然后将文本显示为HTML。因此,我认为我们甚至会修改这些正则表达式,以不需要协议。再次感谢您的帮助! - Kyle Hayes
我刚刚也做了同样的事情...请在这里查看我的最终解决方案:http://stackoverflow.com/questions/2099892/extracting-1-or-more-hyperlinks-from-paragraph-text-in-javascript-using-regular-e - Buhake Sindi

2
该模式本身看起来没问题,但我猜是因为反斜杠转义的原因。
请看一下这个链接:http://www.regular-expressions.info/java.html 在Java字符串中,反斜杠是一个转义字符。字面上的字符串“\\”表示一个反斜杠。在正则表达式中,反斜杠也是一个转义字符。正则表达式\ \匹配一个反斜杠。将该正则表达式作为Java字符串,则变成“\\\\”。没错,需要四个反斜杠才能匹配一个反斜杠。
因此,如果您要在Java中重用JavaScript正则表达式,则需要将\替换为\\,反之亦然。

1
值得注意的是,即使您通过Java在GWT中使用正则表达式,您仍应考虑它们是否适用于JavaScript(语法有时可能不同):http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&s=google-web-toolkit-doc-1-5&t=DevGuideJavaCompatibility。因此,最好的方法就像Anurag指出的那样,通过JSNI处理正则表达式。 - Igor Klimer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接