【问题标题】:How to REGEX match and doesn't match substring如何正则表达式匹配和不匹配子字符串
【发布时间】:2014-11-01 04:08:13
【问题描述】:

如果匹配和不匹配子字符串,如何组合正则表达式?

例如:

http://www.domain.com/user.php?query=blah
http://www.domain.com/member.php?query=blah
http://www.domain.com/user.php?query=blah&context=DkUdh8ShTkNNkwoIJkl
http://www.domain.com/member.php?query=blah&context=DkUdDh8ShTaDfkNNkwoIJkl

我想获取包含"user.php""member.php" 的网址,但如果包含"context",我不想获取网址

如果包含“user.php”和“member.php”,我可以使用匹配 url:

(user\.php|user\.php)

如果不包含“上下文”:

^((?!context).)*$

(user\.php|user\.php)^((?!context).)*$ 如何组合?

我的结果应该是:

http://www.domain.com/user.php?query=blah
http://www.domain.com/member.php?query=blah

感谢您的帮助...

【问题讨论】:

    标签: javascript php regex match


    【解决方案1】:

    使用这种模式
    ^(?=.*(?:user|member))(?!.*context).*$
    成功:

    ^(?=.*\/(?:user|member)\b\.php)(?!.*context).*$
    

    Demo

    
    ^                           # begining of string
    (?=.*\/(?:user|member)\.php)        # look ahead for "/user.php" or "/memeber.php"
    (?!.*context)               # negative look ahead for "context"
    .*$                      # anything to the end
    

    【讨论】:

    • @Ruditabuti 这将匹配包含 users 的网址
    • 更准确地说,它只会匹配类似的名称,例如xyzusermembership,而不需要匹配.php 扩展名。
    • 这里,为挑剔者^(?=.*\/(?:user|member)\b\.php)(?!.*context).*$
    • 您的原始答案可能有效,因为 OP 没有碰巧在包含 usermember 的字符串上使用它,这些字符串不是文件名的一部分(user.php 或 @987654333 @) 紧跟在域之后。 context 仍然存在相同的漏洞。从示例来看,您可能应该在寻找(?!.*[&?]context=),并且您只需要在文件名 之后寻找它。但是您修改后的答案与问题相符,因此我删除了我的反对票。
    【解决方案2】:

    您可以使用Negative Lookahead 来执行此操作。

    ^(?!.*context).*\b(?:user|member)\.php.*$
    

    Live Demo

    【讨论】:

      【解决方案3】:
      ^(?=.*?(?:\buser\b|\bmember\b)\.php)(?:https?:\/\/)?[^/]*/(?:(?!context).)*$
      

      你可以试试这个。查看演示。

      http://regex101.com/r/yG7zB9/14

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 2016-02-14
        • 1970-01-01
        • 2013-04-13
        • 2022-07-11
        • 2020-04-24
        • 2023-03-13
        相关资源
        最近更新 更多