假设我有一个字符['A'-'Z']
的间隔,我希望匹配除'F'
字母以外的所有字符,我需要通过^
运算符进行匹配。因此,我不想将其分成两个不同的时间间隔。
我怎样才能以最好的方式做到这一点?我想写一些类似['A'-'Z']^'F'
的东西(除了字母F之外的A-Z之间的所有字符)。此网站可用作参考:http://regexr.com/
编辑:与ocaml的关系是我要在ocamllex中定义一个字符串文字的正则表达式,以双引号(")开头/结尾,并在一定的范围。因此,我想排除双引号,因为它显然结束了字符串。 (我暂时不考虑逃脱的角色)
答案 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
标记。
答案 4 :(得分:0)
使用字符类减法:
[A-Z&&[^F]]
[A-EG-Z]
的替代方案是" OK"对于单个例外,但在有许多例外时会迅速崩溃。考虑辅音(非元音)的简洁表达式:
[B-Z&&[^EIOU]]
对这列火车失事
[B-DF-HJ-NP-TV-Z]