【问题标题】:Is there a such thing as "negated alternation", or "negated string classes", a la "negated character classes", in PCRE?在 PCRE 中是否存在诸如“否定交替”或“否定字符串类”、“否定字符类”之类的东西?
【发布时间】:2012-09-15 13:26:19
【问题描述】:

好的,所以虽然[abc] 模式匹配单个字符abc,但模式[^abc] 匹配任何给定的不是字符> abc

现在,如果我在上述语句中用 string 代替 character,如果我还将第一个模式更改为类似 (abc|def|ghi) 的交替构造,它仍然适用。 -- 它将匹配三个字符的连续字符串,等于abcdefghi。我该怎么做才能匹配任何 等于 abcdefghi 的三个字符的字符串?

【问题讨论】:

  • 您已将其标记为“javascript”和“pcre”。请注意,尽管它们在许多方面都相似,但它们在正则表达式实现中具有相同的功能。

标签: javascript regex pcre


【解决方案1】:

这是一个关于正则表达式的常见问题,简短的回答是“否”,正则表达式的操作方式不提供“除...之外的任何 3 个字母字符串”的说法。

然而,一些正则表达式引擎允许所谓的“负前瞻断言”。这些有点难以理解 - this explanation of lookaround 似乎涵盖得很好,如果有点技术上的话。

关于前瞻的重要一点是它是“零宽度”——它不会“用尽”任何字符串。所以在Javascript中你可以匹配这样的字符串:'abc123ghi'.match(/abc(?!def)...ghi/) - (?!def)表示'abc'后面不能有字母'def',但...需要在那里表示应该是其他 3 个字符。

【讨论】:

  • 是的,我知道消极的环顾,但不够聪明,无法想出这种解决方法。总之,很酷——谢谢!
  • 或者那是 abc 后面不跟 def 但是 yes 后面跟三个连续的相同的字符?
  • @adlwalrus 是的,这将完全一样 - .{3} 完全等同于 ...
【解决方案2】:

您可以使用否定前瞻来执行您所说的某些操作:

xyz(?!abc|def|ghi)

这意味着“xyz 后跟除 abc、def 或 ghi 之外的任何内容”。它实际上并没有消耗源,所以在那之后你会在“xyz”之后放置应该继续匹配的东西。也就是说,

/xyz(?!abc|def|ghi)(\w*)/

匹配“xyzhello”,第一个捕获组将包含“hello”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多