匹配可被 4 整除的数字的正则表达式是什么?

What is a regular expression for matching numbers divisible by 4?

我想制作一个词法分析器来检测可被 4 整除的数字。
示例代码 -

%%
16(divisible by 4) {printf("divisible by 4 %s\n",yytext);}
%%
main()
{
        yylex();
}

被 4 整除

能被4整除的个位数是0、4、8

能被4整除的两位数可以分为两组:

12, 16, 32, 36, 52, 56, 72, 76, 92, 96
20, 24, 28, 40, 44, 48, 60, 64, 68, 80, 84, 88

任何三位数或更多位数且以这些两位数中的任何一个结尾的数字都可以被四整除。

因此,正则表达式应搜索 \d*[02468][048] 形式的数字,或 \d*[13579][26] 形式的数字,或单个数字 048.

正则表达式

此正则表达式匹配所有可被 4 整除的正数或负数:

-?(?:\d*[02468][048]|\d*[13579][26]|[048])

请注意,这可以匹配数字的一部分,例如 1245 中的 24。如果你想确保你只匹配一个完整的数字,你可以添加否定的环视表达式:

(?<!\d)-?(?:\d*[02468][048]|\d*[13579][26]|[048])(?!\d)

或者您可以使用单词边界:

\b-?(?:\d*[02468][048]|\d*[13579][26]|[048])\b
%%  
[0-9]+  {int number = atoi(yytext); if((number % 4) == 0) printf("Div_4 %d\n", number);}
%%

main()
{
        yylex();
}

由于lex/flex支持C,所以可以将字符串保存为整数,然后在C中查看。