[英]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.