Flex手机号识别代码在macOS无法运行但Ubuntu正常,求原因与解决办法
macOS下Flex手机号验证代码结果异常的原因与解决方法
问题代码
你使用的Flex验证代码如下:
%{ #include <stdio.h> int n; %} %% ^[79][0-9]{9} {printf("Valid Phone number.\n");} .* {printf("Invalid Phone number.\n");} %% int yywrap(){} int main(){ yylex(); return 0; }
异常原因
macOS系统默认自带的是BSD lex,而非Ubuntu上的GNU flex,两者在正则表达式语法支持上存在关键差异:
- GNU flex默认支持扩展正则表达式,允许直接使用
{n}这种量词语法表示重复次数; - BSD lex属于传统lex实现,仅支持基础正则表达式,
{}作为特殊字符需要转义,否则会被当作普通字符处理,导致你的正则规则无法匹配预期的10位数字。
此外,两者在输入处理的默认行为上也有细微差别,进一步导致结果不一致。
解决方法
方法1:安装GNU flex(推荐)
通过Homebrew安装GNU flex,让macOS环境和Ubuntu保持一致,无需修改代码:
- 安装Homebrew(若未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 安装GNU flex:
brew install flex
- 编译运行代码:
flex phone_check.l cc lex.yy.c -o phone_check ./phone_check
方法2:修改代码适配BSD lex
如果不想额外安装工具,可修改正则规则,转义量词的大括号:
%{ #include <stdio.h> int n; %} %% ^[79][0-9]\{9\} {printf("Valid Phone number.\n");} .* {printf("Invalid Phone number.\n");} %% int yywrap(){} int main(){ yylex(); return 0; }
之后用系统自带的lex编译:
lex phone_check.l cc lex.yy.c -o phone_check ./phone_check
内容的提问来源于stack exchange,提问作者Kush Joshi
相关产品推荐
相关产品推荐

