如何从匹配中排除模式中任何位置的字符串?

时间:2011-04-04 21:45:16

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

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

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

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

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

fred=f

到目前为止,我已经:

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

匹配:

但不是:

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

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

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

然后匹配此网址:

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

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

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

3 个答案:

答案 0 :(得分:1)

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

myString.search("fred=f");

泰勒。

答案 1 :(得分:0)

编辑:更改了表达式。以前的版本仅限于 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
  11. 我的正则表达式与粗体表示相匹配。 我在www.RegexTester.com

    测试了它

答案 2 :(得分:0)

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

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