Regex 带异常的正则表达式字符间隔
假设我有一个字符间隔Regex 带异常的正则表达式字符间隔,regex,compiler-construction,ocaml,Regex,Compiler Construction,Ocaml,假设我有一个字符间隔['A'-'Z'],我想匹配除字母'F'之外的所有字符,我需要通过^操作符来匹配。因此,我不想把它分成两个不同的间隔 我怎样才能做到最好?我想写一些类似于['A'-'Z']^'F'(A-Z之间的所有字符,字母F除外)。本网站可作为参考: EDIT:与ocaml的关系是,我想在OCAMLEX中定义一个字符串文本的正则表达式,它以双引号(“)开头/结尾,并在一定范围内接受允许的字符。因此,我想排除双引号,因为它显然以字符串结尾。(我暂时不考虑转义字符)(?!F)[A-Z]或((?
['A'-'Z']
,我想匹配除字母'F'
之外的所有字符,我需要通过^
操作符来匹配。因此,我不想把它分成两个不同的间隔
我怎样才能做到最好?我想写一些类似于['A'-'Z']^'F'
(A-Z之间的所有字符,字母F除外)。本网站可作为参考:
EDIT:与ocaml的关系是,我想在OCAMLEX中定义一个字符串文本的正则表达式,它以双引号(“)开头/结尾,并在一定范围内接受允许的字符。因此,我想排除双引号,因为它显然以字符串结尾。(我暂时不考虑转义字符)(?!F)[A-Z]
或((?!F)[A-Z])*
这将匹配除“F”之外的所有大写字符因为很少发现两个正则表达式库/处理器具有完全相同的正则表达式语法,因此务必精确指定您使用的系统 问题中的标签让我相信您可能正在使用
ocamlex
构建扫描仪
['A'-'Z'] # 'F'
这大致基于中使用的语法:
Java和Ruby正则表达式包含一个具有非常不同语法的类似运算符:
[A-Z&&[^F]]
如果您使用的正则表达式库包括(Perl、Python、/C++等),则可以使用以下其中之一:
(?!F)[A-Z]
或者,您可以将肯定的先行断言与否定的字符类结合使用:
(?=[A-Z])[^F]
在这个简单的例子中,这两种结构都有效地实现了连接,但环顾断言并不是真正的连接。对于实现了连接运算符的正则表达式系统,请参见,例如,.下面的正则表达式使用
^
实现了您想要的功能,并且没有拆分为不同的间隔s、 它还重新组合了您的原始想法(['A'-'Z']^'F'
)
如果只允许使用大写字母,请删除i
标志
使用字符类减法:
[A-Z&&[^F]]
一个例外,<>代码> [AG-E-Z] 是“OK”,但是当有很多异常时迅速分解。考虑辅音(非元音)的简洁表达式:
这辆火车失事了[B-DF-HJ-NP-TV-Z]
字符集差异的ocamlex语法为:
['A'-'Z']#'F'
这相当于
['A'-'E''G'-'Z']
你能举例说明你试图匹配的内容和预期的输出吗?我认为这比分割范围更有效([A-EG-Z]
)你能解释一下与编译器构造的关系吗?这应该是一个被ocamlex接受的正则表达式吗?ocaml
标记是不够的。你打算在哪个上下文中使用正则表达式?ocamlex
,Str
,pcre-ocaml
,…?这里有很多选择,答案可能是这完全取决于您使用的后端。如果您使用的是ocamlex,则不能将其用作参考。ocamlex有一个非常特殊的正则表达式语法(包括使用\uuu
而不是使用
作为通配符)。这很酷,但似乎它仅在Java和Ruby中可用
[A-Z&&[^F]]
[B-Z&&[^EIOU]]
[B-DF-HJ-NP-TV-Z]