Set minimum and maximum characters in a regular expression

java, regex

Solution

Yes

Just like `+` means one or more you can use `{3,30}` to match between 3 and 30

For example `[a-z]{3,30}` matches between 3 and 30 lowercase alphabet letters

From the documentation of the Pattern class

X{n,m}    X, at least n but not more than m times

In your case, matching 3-30 letters followed by spaces could be accomplished with:

([a-zA-Z]\s){3,30}

If you require trailing whitespace, if you don't you can use: (2-29 times letter+space, then letter)

([a-zA-Z]\s){2,29}[a-zA-Z]

If you'd like whitespaces to count as characters you need to divide that number by 2 to get

([a-zA-Z]\s){1,14}[a-zA-Z]

You can add `\s?` to that last one if the trailing whitespace is optional. These were all tested on RegexPlanet

If you'd like the entire string altogether to be between 3 and 30 characters you can use lookaheads adding `(?=^.{3,30}$)` at the beginning of the RegExp and removing the other size limitations

All that said, in all honestly I'd probably just test the `String`'s `.length` property. It's more readable.

Problem

I've written a regular expression that matches any number of letters with any number of single spaces between the letters. I would like that regular expression to also enforce a minimum and maximum number of characters, but I'm not sure how to do that (or if it's possible). My regular expression is: ``` [A-Za-z](\s?[A-Za-z])+ ``` I realized it was only matching two sets of letters surrounding a single space, so I modified it slightly to fix that. The original question is still the same though. Is there a way to enforce a minimum of three characters and a maximum of 30?

Original source

Related problems