簡體   English   中英

如何使此正則表達式正確匹配?

[英]How can I make this regex match correctly?

鑒於此正則表達式:

^((https?|ftp):(\/{2}))?(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)*?))(\.)([a-z]{2}
|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum){1})

重新格式化以提高可讀性:

@"^((https?|ftp):(\/{2}))?" + // http://, https://, ftp:// - Protocol Optional
@"(" + // Begin URL payload format section
@"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" + // IPv4 Address support
@")|("+ // Delimit supported payload types
@"((([a-zA-Z0-9]+)(\.)*?))(\.)([a-z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum){1}" + // FQDNs
@")"; // End URL payload format section

如何在此“失敗”測試用例上使其失敗(即不匹配)?

http://www.google

當我在TLD部分中指定{1}時,我認為如果沒有擴展名它將失敗。 我錯了嗎?

編輯:這些是我的通過條件:

這些是我的失敗條件:

我會提出另一個建議。 您可能需要結合使用內置System.Uri類的解析和幾個目標正則表達式(或在適當時進行簡單的字符串檢查)。

例:

string uriString = "...";

Uri uri;
if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri))
{
    // Uri is totally invalid!
}
else
{
    // validate the scheme
    if (!uri.Scheme.Equals("http", StringComparison.OrdinalIgnoreCase))
    {
        // not http!
    }

    // validate the authority ('www.blah.com:1234' portion)
    if (uri.Authority // ...)
    {
    }

    // ...
}

有時,一個萬能的reqex不是最佳解決方案,但是很誘人。 盡管調試此正則表達式是可行的(請參閱Greg Hewgills的答案),但請考慮針對不同類別的問題進行一些測試,例如,針對數字地址的一項測試和針對命名地址的一項測試。

您需要強制正則表達式匹配直到字符串的末尾。 在其末尾添加一個$ 否則,您的正則表達式可能只匹配http:// ,或者比整個字符串短的其他內容。

“驗證網址”問題已被解決*很多次。 我建議您使用System.Uri類,它可以驗證更多的案例,而不用您動搖。

代碼Uri uri = new Uri(" http://whatever "); 如果驗證失敗,則拋出UriFormatException 那可能就是您想要的。

*)或某種解決。 定義什么是有效的URL實際上非常棘手。

有關定義的所有信息,“有效網址”應在您執行DNS查找時為您提供IP地址。 該IP應該已連接,並且在發送請求時,您會收到可以使用的HTML信息形式的答復。

因此,我們正在尋找一種“有效的URL格式”,這就是system.uri派上用場的地方。 但是,如果URL隱藏在很大的tekst中,則您首先要查找可以驗證為有效URL格式的內容。

區別於任何給定的可讀tekst的URL的原因是點號后面沒有空格。 “ 123.com”可以驗證為真實網址。

使用正則表達式

[a-z_\.\-0-9]+\.[a-z]+[^ ]*

查找文本中任何可能的有效url,然后執行system.uri檢查以查看其是否為有效的URL格式,然后進行查找。 僅當查找為您提供結果時,您才知道URL有效。

暫無
暫無

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

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