【问题标题】:regex string does not contain substring正则表达式字符串不包含子字符串
【发布时间】:2011-07-22 21:35:45
【问题描述】:

我正在尝试匹配一个不包含子字符串的字符串

我的字符串总是以“http://www.domain.com/”开头

我要从匹配项中排除的子字符串是“.a/”,它位于字符串(域名中的文件夹名称)之后

字符串中我要排除的子字符串后面会有字符

例如:

“http://www.domain.com/.a/test.jpg”不应匹配

但是“http://www.domain.com/test.jpg”应该是

【问题讨论】:

    标签: regex string substring


    【解决方案1】:

    使用否定的前瞻断言:

    ^http://www\.domain\.com/(?!\.a/).*$
    

    Rubular Link

    如果 URL 后面紧跟 .a/ 字符串,则 (?!\.a/) 部分匹配失败。

    【讨论】:

    • 如果我想用引号 (") 结束匹配怎么办?当我在 HTML 中搜索时。
    【解决方案2】:

    在这种情况下,我的建议是不要使用负面的前瞻性断言或类似的东西来构建过于复杂的正则表达式。
    保持简单和愚蠢!
    做 2 场比赛,一场是正面的,然后再整理出负面的(或反之亦然)。大多数时候,正则表达式变得更容易,即使不是微不足道的。 您的程序会变得更清晰。
    例如,要提取所有带有 foo 而不是 foobar 的行,我使用:

    grep foo | grep -v foobar
    

    【讨论】:

      【解决方案3】:

      我会尝试

      ^http:\/\/www\.domain\.com\/([^.]|\.[^a]).*$
      

      您想要匹配您的域,以及所有不以 .一切都以 a 继续。但不是a。 (最终你可以添加你/如果需要的话)

      【讨论】:

      • 这很好 - 直到 另一个 程序员被要求扩展它以排除 .b、.c 和 .whatElsethemanagementdoesnotwant
      • 是的...我明白了@Ingo。顺便说一句,我在 / 之前忘记了 \
      【解决方案4】:

      如果您不使用前瞻,而只是使用简单的正则表达式,您可以说,如果它与您的域匹配但与 .a/ 不匹配

      <?php
      
      function foo($s) {
      
          $regexDomain = '{^http://www.domain.com/}';
          $regexDomainBadPath = '{^http://www.domain.com/\.a/}';
      
          return preg_match($regexDomain, $s) && !preg_match($regexDomainBadPath, $s);
      }
      
      var_dump(foo('http://www.domain.com/'));
      var_dump(foo('http://www.otherdomain.com/'));
      
      var_dump(foo('http://www.domain.com/hello'));
      var_dump(foo('http://www.domain.com/hello.html'));
      var_dump(foo('http://www.domain.com/.a'));
      var_dump(foo('http://www.domain.com/.a/hello'));
      var_dump(foo('http://www.domain.com/.b/hello'));
      var_dump(foo('http://www.domain.com/da/hello'));
      
      ?>
      

      注意http://www.domain.com/.a 将通过测试,因为它不会以/ 结尾。

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 2012-05-11
        • 2011-06-27
        • 1970-01-01
        相关资源
        最近更新 更多