FLEX中匹配带指数的正负整数、浮点数的正则写法问题
现有规则的问题
- 误用了行首
^和行尾$锚定符:Flex的匹配规则是针对输入流中的独立token设计的,添加行首行尾锚点后,只有数字单独占据完整一行时才能被匹配,正常嵌入在代码/文本中的数字会完全匹配失败。 - 使用了Flex不原生支持的
\d简写:Flex的正则语法不兼容Perl风格的数字简写\d,部分版本会直接识别为普通字符d,导致匹配逻辑错误,需要替换为标准的[0-9]写法。
正确实现方案
首先在Flex的声明段提前定义计数器变量:
%{ int CountInteger = 0; int CountFloat = 0; %}
然后在规则段使用如下匹配规则即可:
/* 匹配整数:支持正负、科学计数法 */ [+-]?[0-9]+([eE][+-]?[0-9]+)? { ++CountInteger; } /* 匹配浮点数:支持正负、小数点、科学计数法 */ [+-]?[0-9]*\.[0-9]+([eE][+-]?[0-9]+)? { ++CountFloat; } /* 可选:忽略空白符,可根据实际需求调整 */ [ \t\n\r]+ { ; }
补充说明
如果需要支持123.这类小数点后无数字的浮点数格式,可以将浮点数的匹配规则修改为:
[+-]?([0-9]+\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)? { ++CountFloat; }
内容的提问来源于stack exchange,提问作者Ashikur Rahman
相关产品推荐
相关产品推荐

