我实现了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中正确执行的正则表达式模式。
答案 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是任何数字端口号。