Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

regular expressions: match x times OR y times

Tags:

regex

People also ask

How do you match a regular expression?

To match a character having special meaning in regex, you need to use a escape sequence prefix with a backslash ( \ ). E.g., \. matches "." ; regex \+ matches "+" ; and regex \( matches "(" . You also need to use regex \\ to match "\" (back-slash).

What does regex 0 * 1 * 0 * 1 * Mean?

Basically (0+1)* mathes any sequence of ones and zeroes. So, in your example (0+1)*1(0+1)* should match any sequence that has 1. It would not match 000 , but it would match 010 , 1 , 111 etc. (0+1) means 0 OR 1.


^(\d{3}|\d{6})$

You have to have some sort of terminator otherwise \d{3} will match 1234. That's why I put ^ and $ above. One alternative is to use lookarounds:

(?<!\d)(\d{3}|\d{6})(?!\d)

to make sure it's not preceded by or followed by a digit (in this case). More in Lookahead and Lookbehind Zero-Width Assertions.


How about:

(\d\d\d){1,2}

although you'll also need guards at either end which depend on your RE engine, something like:

[^\d](\d\d\d){1,2}[^\d]

or:

^(\d\d\d){1,2}$

For this case we can get away with this crafty method:

Clean Implementation

/(\d{3}){1,2}/
/(?:\d{3}){1,2}/

How?!

This works because we're looking for multiples of three that are consecutive in this case.

Note: There's no reason to capture the group for this case so I add the ?: non capture group flag to the capture group.

This is similar to paxdiablo implementation, but slightly cleaner.

Matching Hex

I was doing something similar for matching on basic hex colors since they could be 3 or 6 in length. This allowed me to keep my hex color checker's matching DRY'd up ie:

/^0x(?:[\da-f]{3}){1,2}$/i

First one matches 3, 6 but also 9, 12, 15, .... Second looks right. Here's one more twist:

\d{3}\d{3}?