当我尝试在flex中使用regex时,如下定义一个int类型:
int (?<!\w)(([1-9]\d*)|0)(?!\w)
我打算让这个无效:
int a = 123;
int b = 123f; //the '123' should not filtered as an int type
然而,我得到了这个:
bad character: <
bad character: !
bad character: \
...
更重要的是,似乎正则表达式中的?
被忽略了。
我很困惑。
flex是否不支持前瞻断言(?<=xxx)
或(?<!xxx)
?
我是flex的新手,我真的需要一些帮助
答案 0 :(得分:13)
那是对的。 Flex不支持负前瞻断言。它也不支持\w
或\d
,但它允许使用posix样式的字符类([[:alpha:]]
,[[:digit:]]
,[[:alnum:]]
等。)
Flex正则表达式与javascript-like或perl / python-like&#34; regular&#34;完全不同。表达式。首先,flex的正则表达式非常规则。
语法flex允许的完整列表位于flex manual。任何未在本手册的该部分中描述的内容都是未通过flex实现。
使用&#34; lookbehind&#34;几乎没有什么意义。使用flex,因为flex始终匹配当前输入点的最长标记 。它不会在输入中搜索模式。
Flex 使用/
运算符(它不是我所知道的任何正则表达式库的一部分)实现有限形式的正向前瞻。你可以使用它只匹配一系列数字后面没有紧跟一个字母:
[[:digit:]]+/[^[:alpha:]]
但是你需要一些匹配数字序列后跟字母字符的模式,因为flex不会搜索匹配的标记。