问题
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