簡體   English   中英

GWT中的正則表達式匹配URL

[英]Regex in GWT to match URLs

我實現了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中正確執行。

您將不得不使用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中請求的確切功能。 我想使用像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是任何數字端口號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM