正则表达式:匹配所有内容,但不匹配特定的模式

我需要一个能够匹配所有内容的正则表达式,但是需要一个以特定模式开头的字符串(特别是index.php以及后面的内容,比如index.php?id=2342343

正则表达式:匹配所有

  • 以特定模式开头的字符串(例如,任意-空,也-不以foo开头的字符串)
    • 基于前瞻的NFA解决方案:
      • ^(?!foo)。*$
      • ^(?!foo)
  • 针对不支持lookarounds的正则表达式引擎的基于否定字符类的解决方案
    • ^(([^f].{2}.[o].{2}[^o]).*.{0,2})$
    • ^([^f].{2}.[^o].{2}[^o]).{0,2}$
  • 以特定模式结尾的字符串(例如,结尾处没有world.):
    • 基于查找的解决方案:
      • (?<!world\)$
      • ^.*(<!world\)$
    • 前瞻解决方案:
      • ^(?。*world\.$).
      • ^(?。*world\.$)
    • POSIX解决方案:
      • ([^w].{5}.[^o].{4}.{2}.[^r].{3}.{3}.[^l].{2}.{4}.[^d].{5}.[^.]$$.{0,5})$
  • 包含特定文本的字符串(例如,与包含foo的字符串不匹配):
    • 基于查找的解决方案:
      • ^(?。*foo)
      • ^(?。*foo.*$
    • POSIX解决方案:
      • 使用www.formauri.es/personal/pgimeno/misc/non-match-regex上的在线正则表达式生成器
  • 包含特定字符的字符串(例如,避免匹配具有|符号的字符串):
    • ^[^ |]*$
  • 一个字符串等于某个字符串(比如,不等于foo):
    • 基于环顾的:
      • ^(?!foo$)
      • ^(?!foo$).$
    • POSIX:
      • ^(.{0,2}.{4,}.[^f].[^o].[124o].[^o])$
  • 字符序列
    • PCRE(匹配除猫以外的任何文本):/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i/cat(*SKIP)(*FAIL)|(?:(!cat)。+/is
    • 允许环视的其他引擎:(cat)[^c]*(?:c(?!at)[^c]*)*(或(?s)(cat)(?:(?:(?!cat)。*,或(cat)[^c]+(?:c(?!at)[^c]*(?:c(?!at)[^c]*)+[^c]*)然后用语言方式检查:如果第1组匹配,它不是我们需要的,否则,请获取匹配值
  • 某些单个字符或一组字符
    • 使用否定字符类:[^a-z]+(除小写ASCII字母以外的任何字符)
    • 匹配任何字符,但[^ |]+

演示说明:在演示中,换行符\n用于否定字符类中,以避免匹配溢出到相邻行。在测试单个字符串时,它们不是必需的

锚注:在许多语言中,使用\A定义字符串的明确开头,并使用\z(在Python中,它是\z,在JavaScript中,$是可以的)定义字符串的最末端

点注:在许多口味中(但不是POSIX、TRE、TCL),匹配任何字符,但换行符字符。确保对使用相应的DOTALL修饰符(/s在PCRE/Boost/.NET/Python/Java中,以及/m在Ruby中),以匹配任何字符,包括换行符

反斜杠注释:在必须使用允许转义序列的C字符串声明模式的语言中(如换行符的\n),需要将转义特殊字符的反斜杠加倍,以便引擎可以将其视为文字字符(例如,在Java中,world\.将被声明为“world\\\”,或者使用一个字符类:“world[.])。使用原始字符串文字(Pythonr'\bworld\b'),C#逐字字符串文字@“world\”,或像/world\/这样的slashy字符串/regex文字符号

发表评论