You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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保持一致,无需修改代码:

  1. 安装Homebrew(若未安装):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安装GNU flex:
brew install flex
  1. 编译运行代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:51:35