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

∥☆過路亽.° 提交于 2019-12-13 09:03:05

问题


I want to make a lexical analyzer that detects numbers divisible by 4.
Sample code -

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

回答1:


%%  
[0-9]+  {int number = atoi(yytext); if((number % 4) == 0) printf("Div_4 %d\n", number);}
%%

main()
{
        yylex();
}

As lex/flex support C, so you can save the string as integer and then check it in C.




回答2:


Divisibility by 4

The single-digit numbers which are divisible by 4 are 0, 4, and 8.

The two-digit numbers which are divisible by 4 can be divided into two groups:

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

Any number which is three or more digits and ends in any of these two-digit numbers is divisible by four.

Therefore, the regular expression should search for numbers of the form \d*[02468][048], or the form \d*[13579][26], or the single digit numbers 0, 4, and 8.

The Regex

This regular expression matches all numbers, positive or negative, which are divisible by 4:

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

Note that this could match part of a number, such as 24 in 1245. If you want to make sure that you only match an entire number, you could add negative look-around expressions:

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

or you could use word boundaries:

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


来源:https://stackoverflow.com/questions/48352672/what-is-a-regular-expression-for-matching-numbers-divisible-by-4

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!