我如何从匹配中排除模式中的任何字符串

How can I exclude a string anyhwere in the pattern from matches?

本文关键字:排除 模式 任何 字符串      更新时间:2023-09-26

我需要写一个正则表达式,它将匹配URL做有一个特定的查询字符串名称/值对任何地方在其URL。应该匹配所有其他查询字符串名称,以及具有相同名称的所有其他查询字符串值。不应该匹配同一目录(或子目录)中的其他页面。

例如,假设我需要匹配的基URL是:
 http://www.domain.com/directory/之前

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

<>以前弗雷德= f 之前

到目前为止,我得到了:

<>以前http://www ' .domain ' .com/directory/(?!('?|&) 弗雷德= 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/?fred=f

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

  • http://www.domain.com/directory/?foo=bar&弗雷德= f

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

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

则匹配此URL:

  • http://www.domain.com/directory/foobar?fred=f

(似乎[a-z]比disallow组更强)

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

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

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

myString.search("fred=f");
泰勒。

我的一位同事为这个答案提供了依据:

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

编辑:更改表达式。以前的版本仅限于99个字符。

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

我做了这样的东西

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

并在以下字符串

上进行测试
  1. domain.com/directory/? foo =的bar = f
  2. domain.com/directory/? foo = bar
  3. domain.com/directory/? aaa酒吧=
  4. domain.com/directory/
  5. domain.com/directory/?弗雷德=
  6. domain.com/directory/?弗雷德= foo
  7. domain.com/directory/? foo = bar&弗雷德= foo
  8. domain.com/directory/?弗雷德=的aaaw = bbb
  9. domain.com/directory/?弗雷德= f
  10. domain.com/directory/? foo = bar&弗雷德= f

我的regexp匹配黑体部分。我已经在www.RegexTester.com

进行了测试