代码之家  ›  专栏  ›  技术社区  ›  tsilb

怎样才能使正则表达式正确匹配?

  •  1
  • tsilb  · 技术社区  · 15 年前

    给定此正则表达式:

    ^((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}时,我认为如果没有扩展,它将失败。我错了吗?

    编辑:以下是我的通过条件:

    以下是我的失败条件:

    5 回复  |  直到 11 年前
        1
  •  4
  •   bobbymcr    15 年前

    我将提出另一个建议。您可能希望使用内置 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 // ...)
        {
        }
    
        // ...
    }
    
        2
  •  3
  •   Zano Turnkey    15 年前

    有时候,一个通吃的reqex并不是最好的解决方案,尽管它很诱人。虽然调试这个regex是可行的(请参阅greg hewgills的答案),但可以考虑对不同类别的问题进行两次测试,例如,对数字地址进行一次测试,对命名地址进行一次测试。

        3
  •  2
  •   Greg Hewgill    15 年前

    您需要强制正则表达式匹配到字符串的末尾。添加一个 $ 就在最后。否则,您的regex可能只是匹配 http:// ,或者其他比你整个绳子短的东西。

        4
  •  1
  •   Zano Turnkey    15 年前

    “验证一个url”的问题已经被多次解决了。我建议你用 System.Uri 类,它可以验证更多的情况,而不是摇晃一根棍子。

    代码 Uri uri = new Uri(" http://whatever "); 抛出一个 UriFormatException 如果验证失败。这可能是你想要的。

    *)或者解决了。定义什么是有效的url实际上相当复杂。

        5
  •  0
  •   Sedecimdies    11 年前

    关于定义,“有效的url”应该在您进行dns查找时为您提供一个ip地址。IP应该连接到,当发出请求时,您可以得到HTML信息的答复,您可以使用它。

    所以我们要找的是一个“有效的url格式”,这就是 system.uri 非常方便。但是,如果url隐藏在tekst的一大块中,那么您首先需要找到能够验证为有效url格式的内容。

    从任何给定的可读tekst中分离出一个url的地方是点,后面没有空白。”123.com“可以验证为一个真正的url。

    使用regex

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

    要在文本中找到任何可能的有效url,然后执行system.uri检查以查看其是否为有效的url格式,然后执行查找。只有当查找给您一个结果时,您才知道url是有效的。