如何匹配一组中的字符,但不匹配第一组中的字符?

时间:2011-08-28 02:31:05

标签: regex flex-lexer

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果flex支持postivie / negative lookahead / lookbehind,你可以尝试搞乱这些功能。我愿意打赌它会比写[A-EI-Z]更复杂,而且效率也大大降低。

修改:在阅读完评论后发现“漏洞”'你希望在你的范围内可能直到运行时才知道,你必须用前瞻/后瞻来做。这种语法在正则表达式引擎之间有所不同,我不确定flex,或者它是否能做到这一点。基本上,您需要一个与[A-Z]匹配的正则表达式,以及[F-H]的负面后瞻性断言。或匹配[^F-H]后跟[A-Z]的正向前瞻断言。

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