Regex pattern to see if a string contains a number in a range

• A+
Category：Languages

I'm trying to match a number between 400 and 499 anywhere in a string. For example, both:

string = " One too three" string2 = "Yes 450 sir okay"

should match. Both:

string3 = " Test" string4 = "This is another string"

should fail.

What's the best way to write the regex? I wrote:

string =~ //d{3}/

to see if the string contains a three digit integer. How can I see if that's within the range?

If you don't actually need the number afterwords, and just need to determine yes or no the string contains a number in the range of 400-499, you can:

1. Check that you are at the beginning of a line, or have a non-digit character followed by
2. the digit '4' followed by
3. Any 2 digits followed by
4. the end of a line or a non-digit character

so you end up with a regex looking something like

regex = /(?:^|/D)4/d{2}(?:/D|\$)/

or, by using negative look ahead/look behinds:

regex = /(?<!/d)4/d{2}(?!/d)/

and you need step 1 and 4 above to make rule out numbers such as 1400-1499 and 4000-4999 (and other such numbers with more than 3 digits that have 400-499 somewhere buried in them). You can then make use of String#match? in newer ruby versions to get just a simple boolean:

string.match?(regex)   # => true string2.match?(regex)  # => true string3.match?(regex)  # => false string4.match?(regex)  # => false "1400".match?(regex)   # => false "400".match?(regex)    # => true "4000".match?(regex)   # => false "".match?(regex) # => false "".match?(regex)  # => true "".match?(regex) # => false

Fairly simple regex, no need to pull out the match and convert it to an integer if you just need a simple yes or no