【问题标题】:How can I match a character that is in one set, but not in a set within the first set?如何匹配一组中的字符,但不匹配第一组中的一组?
【发布时间】:2023-03-29 09:54:01
【问题描述】:

例如,假设我想匹配一个大写字母A-Z,而不是F-H。如果我没记错的话,大写字母是[A-Z],而不是F-H[^F-H]。直观地说,我希望它是[A-Z^F-H],但这似乎不起作用。我知道它可以做到[A-EI-Z],但我正在寻找更少的解决方法。编辑:寻找更通用的解决方案。

【问题讨论】:

  • [A-EI-Z] 如何成为“解决方法”?它似乎很清楚地描述了这种模式。
  • 对于我提供的示例,是的,但是如果直到运行时才指定我不想要的字符怎么办?有没有办法说“我想要任何不是 x 的大写字母”,其中 x 可以是任何字母。

标签: regex flex-lexer


【解决方案1】:

没有什么是“更少的解决方法”。 [abcdef] 之类的字符范围语法仅用于匹配任何枚举字符。它可以像[^abcdef] 一样反转。然后提供[a-f] 作为语法简写,用于显式写出所有字符。如果要匹配多个范围之间有间隙的范围,则必须指定多个范围。

如果 flex 支持 postivie/negative lookahead/lookbehind,您可以尝试使用这些功能。我敢打赌,它会比写[A-EI-Z] 更复杂,效率也大大降低。

编辑:在阅读了您的评论后,您可能在运行时才知道您想要的范围内的“洞”,您必须使用前瞻/后瞻来完成。正则表达式引擎之间的语法各不相同,我不确定 flex 是否可以做到这一点。本质上,您需要一个匹配[A-Z] 的正则表达式,并带有[F-H] 的否定后向断言。或匹配[^F-H] 的肯定前瞻断言,后跟[A-Z]

lookahead/lookbehind 的关键在于它们实际上不消耗任何输入,如果在当前匹配位置没有满足断言,它们只会导致匹配失败。它们通常比直接做事效率低(如果可以的话),而且很难正确处理,而且不同的正则表达式引擎似乎对何时可以使用和不能使用它们有不同的限制。

【讨论】:

  • 谢谢。我想我会尝试使用开始条件,看看情况如何。看起来周围的环境可能会变得混乱。
  • 除非最近发生了很大变化,否则 flex 没有任何高级功能,如前瞻或后瞻。
【解决方案2】:

如果您的意思是不匹配方括号中的字符,我认为“^”必须是[]中的第一个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多