例如,假设我想匹配大写字母A-Z
,而不是F-H
。如果我没有记错的话,大写字母为[A-Z]
,而F-H
则不是[^F-H]
。直观地说,我希望它是[A-Z^F-H]
,但这似乎不起作用。我知道它可以完成[A-EI-Z]
,但我正在寻找更少的解决方案。编辑:寻找更通用的解决方案。
答案 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]
的正向前瞻断言。
关于前瞻/后视的关键是它们实际上并没有消耗任何输入,如果在当前匹配位置没有遇到断言,它们只会导致匹配失败。它们通常比直接做事(如果可以的话)效率低,并且可能很难做到正确,并且不同的正则表达式引擎似乎对何时可以使用它们有不同的限制。