I am wondering if there is a better to represent a fix amount of repeats in a regular expression. For example, if I just want to match exactly 14 letters/digits, I am using ^\w\w\w\w\w\w\w\w\w\w\w\w\w\w$ which will match a word like UNL075BE499135 and not match UNL075BE499135AAA
is there a handy way to do it? In am currently doing it in java but I guess this may apply to other language as well. Thanks in advance.
- 3,672
- 8
- 34
- 40
4 Answers
For Java:
X, exactly n times: X{n}
X, at least n times: X{n,}
X, at least n but not more than m times: X{n,m}
-
10That is for any perl-compatible regular expression. – Richard Simões Jul 16 '10 at 02:57
-
@BipedalShark the 'bound' is defined in POSIX regexp standard. See `man 7 regex` on most *nix systems. Most common regex languages including Perl's derive at some point from POSIX's. – Ven'Tatsu Jul 16 '10 at 18:19
-
for those who didn't figure out how to do "repeat up to m times", you can use X{0,m} – ihebiheb Mar 08 '19 at 18:20
The finite repetition syntax uses {m,n} in place of star/plus/question mark.
From java.util.regex.Pattern:
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
All repetition metacharacter have the same precedence, so just like you may need grouping for *, +, and ?, you may also for {n,m}.
ha*matches e.g."haaaaaaaa"ha{3}matches only"haaa"(ha)*matches e.g."hahahahaha"(ha){3}matches only"hahaha"
Also, just like *, +, and ?, you can add the ? and + reluctant and possessive repetition modifiers respectively.
System.out.println(
"xxxxx".replaceAll("x{2,3}", "[x]")
); "[x][x]"
System.out.println(
"xxxxx".replaceAll("x{2,3}?", "[x]")
); "[x][x]x"
Essentially anywhere a * is a repetition metacharacter for "zero-or-more", you can use {...} repetition construct. Note that it's not true the other way around: you can use finite repetition in a lookbehind, but you can't use * because Java doesn't officially support infinite-length lookbehind.
References
Related questions
- Difference between
.*and.*?for regex regex{n,}?==regex{n}?- Using explicitly numbered repetition instead of question mark, star and plus
- Addresses the habit of some people of writing
a{1}b{0,1}instead ofab?
- Addresses the habit of some people of writing
- 1
- 1
- 364,035
- 124
- 554
- 617
^\w{14}$ in Perl and any Perl-style regex.
If you want to learn more about regular expressions - or just need a handy reference - the Wikipedia Entry on Regular Expressions is actually pretty good.
- 34,279
- 10
- 88
- 93
In Java create the pattern with Pattern p = Pattern.compile("^\\w{14}$"); for further information see the javadoc
- 13,978
- 1
- 14
- 9