【问题标题】:How can I exclude a string anyhwere in the pattern from matches?如何从匹配项中排除模式中任何位置的字符串?
【发布时间】:2011-04-04 21:45:15
【问题描述】:

我需要编写一个正则表达式来匹配那些 not 在其 URL 中具有特定查询字符串名称/值对 anywhere 的 URL。所有其他查询字符串名称和所有其他具有相同名称的查询字符串值都应匹配。不应匹配同一目录(或子目录)中的其他页面。

例如,假设我需要匹配的基本 URL 是:

http://www.domain.com/directory/

我需要从匹配项中排除的查询字符串名称和值是:

弗雷德=f

到目前为止,我有:

http://www\.domain\.com/directory/(?!(\?|&)fred=f$)

哪些匹配:

但不是:

问题是这个正则表达式也匹配:

如果我改用这个正则表达式:

(?i)http://www\.domain\.com/directory/[a-z]*(?!(\?|&)fred=f$)

那么这个网址就匹配上了:

(好像[a-z]比disallow组强。)

当字符串存在于模式中的任何位置时,如何防止匹配?

(这将在 ActionScript3/ECMAScript3 正则表达式引擎中使用。)

【问题讨论】:

    标签: javascript regex actionscript-3 url query-string


    【解决方案1】:

    您是否有任何理由需要使用正则表达式?为什么不只是简单的字符串搜索?它的作用完全相同,但更容易理解。

    myString.search("fred=f");
    

    泰勒。

    【讨论】:

    • 我在一个接受 URL 或正则表达式以匹配 URL 的平台中工作,以确定是否要执行某些操作。实现更深层次的逻辑需要相当多的工作。
    【解决方案2】:

    我的一位同事提供了这个答案的基础:

    http://www.domain.com/directory/(?!.*(\?|&)fred=f($|&|#))(\?|#|$)
    

    此正则表达式匹配:

    • http://www.domain.com/directory/
    • http://www.domain.com/directory/?fred=a
    • http://www.domain.com/directory/?fred=foo
    • http://www.domain.com/directory/?foo=bar

    但不是:

    • http://www.domain.com/directory/?fred=f
    • http://www.domain.com/directory/?fred=f&a=b
    • http://www.domain.com/directory/?a=b&fred=f

    【讨论】:

      【解决方案3】:

      编辑:更改了表达式。以前的版本限制为 99 个字符。

      EDIT2:改进了表达式,现在匹配更多的情况。

      我做了这样的事情

      (domain.com/directory/.*fred=(?!f$)(?!f&).*)|(domain.com/directory/$)|(domain.com/directory/\?(?!.*fred=f).*)
      

      并在以下字符串上对其进行了测试

      1. domain.com/directory/?foo=f&bar=f
      2. domain.com/directory/?foo=bar
      3. domain.com/directory/?aaa=bar
      4. domain.com/directory/
      5. domain.com/directory/?fred=a
      6. domain.com/directory/?fred=foo
      7. domain.com/directory/?foo=bar&fred=foo
      8. domain.com/directory/?fred=f&aaaw=bbb
      9. domain.com/directory/?fred=f
      10. domain.com/directory/?foo=bar&fred=f

      我的正则表达式与粗体匹配。 我已经在www.RegexTester.com进行了测试

      【讨论】:

      • 第二个正则表达式运行良好,但 {2,99} 是做什么的?它只会匹配某些子字符串中最多 100 个字符吗?
      • 我已经编辑了我的帖子。现在,正则表达式的工作方式与您希望的完全一样。
      • 感谢您为此付出的努力。不幸的是,查询字符串 (domain.com/directory.*fred=(?!f$)(?!f&).*)|(domain.com/directory/$) 无法按我的预期工作,因为它与其他查询字符串不匹配,例如domain.com/directory/?foo=bar
      • 当我的回答符合您的要求时,我建议删除不必要的 cmets。
      猜你喜欢
      • 1970-01-01
      • 2022-12-09
      • 2022-01-07
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2022-08-03
      • 2012-08-22
      相关资源
      最近更新 更多