Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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

%%
16(divisible by 4) {printf("divisible by 4 %s
",yytext);}
%%
main()
{
        yylex();
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
310 views
Welcome To Ask or Share your Answers For Others

1 Answer

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:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...