正则表达式字符间隔有异常

时间:2015-09-08 14:12:02

标签: regex compiler-construction ocaml

假设我有一个字符['A'-'Z']的间隔,我希望匹配除'F'字母以外的所有字符,我需要通过^运算符进行匹配。因此,我不想将其分成两个不同的时间间隔。

我怎样才能以最好的方式做到这一点?我想写一些类似['A'-'Z']^'F'的东西(除了字母F之外的A-Z之间的所有字符)。此网站可用作参考:http://regexr.com/

编辑:与ocaml的关系是我要在ocamllex中定义一个字符串文字的正则表达式,以双引号(")开头/结尾,并在一定的范围。因此,我想排除双引号,因为它显然结束了字符串。 (我暂时不考虑逃脱的角色)

5 个答案:

答案 0 :(得分:3)

由于很难找到具有完全相同的正则表达式语法的两个正则表达式库/处理器,因此始终精确指定您正在使用的系统非常重要。

问题中的标签让我相信您可能正在使用ocamllex来构建扫描仪。在这种情况下,根据其regular expression syntax的文档,您可以使用

['A'-'Z'] # 'F'

这基于flex中使用的语法:

[A-Z]{-}[F]

Java和Ruby正则表达式包含一个语法非常不同的类似运算符:

[A-Z&&[^F]]

如果您使用的是包含negative lookahead assertions(Perl,Python,Ecmascript / C ++等)的正则表达式库,您可以使用其中一个:

(?!F)[A-Z]

或者你可以使用积极的前瞻断言和否定的字符类:

(?=[A-Z])[^F]

在这个简单的例子中,这两个结构都有效地进行了连接,但是外观断言并不是真正的连接。对于实现连词运算符的正则表达式系统,请参阅,例如Ragel

答案 1 :(得分:1)

字符集差异的ocamllex语法是:

['A'-'Z'] # 'F'

相当于

['A'-'E' 'G'-'Z']

答案 2 :(得分:0)

(?!F)[A-Z]((?!F)[A-Z])*

这将匹配除“F”

之外的每个大写字符

答案 3 :(得分:0)

下面的正则表达式使用^完成您想要的内容,而不会分成不同的间隔。它还会重新调整您原来的想法(['A'-'Z']^'F')。

/(?=[A-Z])[^F]/ig

如果只允许使用大写字母,请删除i标记。

Demo

答案 4 :(得分:0)

使用字符类减法:

[A-Z&&[^F]]

[A-EG-Z]的替代方案是" OK"对于单个例外,但在有许多例外时会迅速崩溃。考虑辅音(非元音)的简洁表达式:

[B-Z&&[^EIOU]]

对这列火车失事

[B-DF-HJ-NP-TV-Z]