mtorres
mtorres

Reputation: 197

Cannot match my regular expression

I am trying to match a string that looks like "WIFLYMODULE-xxxx" where the x can be any digit. For example, I want to be able to find the following... WIFLYMODULE-3253 WIFLYMODULE-1585 WIFLYMODULE-1632

I am currently using

final Pattern q = Pattern.compile("[WIFLYMODULE]-[0-9]{3}");

but I am not picking up the string that I want. So my question is, why is my regular expression not working? Am i going about it in the wrong way?

Upvotes: 0

Views: 77

Answers (5)

Braj
Braj

Reputation: 46841

You should use (..) instead of [...]. [..] is used for Character class

With a "character class", also called "character set", you can tell the regex engine to match only one out of several characters.

(WIFLYMODULE)-[0-9]{4}

Here is demo

Note: But in this case it's not needed at all. (...) is used for capturing group to access it by Matcher.group(index)


Important Note: Use \b as word boundary to match the correct word.

\\bWIFLYMODULE-[0-9]{4}\\b

Sample code:

String str = "WIFLYMODULE-3253 WIFLYMODULE-1585 WIFLYMODULE-1632";
Pattern p = Pattern.compile("\\bWIFLYMODULE-[0-9]{4}\\b");
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.println(m.group());
}

output:

WIFLYMODULE-3253
WIFLYMODULE-1585
WIFLYMODULE-1632

Upvotes: 1

Robby Cornelissen
Robby Cornelissen

Reputation: 97120

This way will work:

final Pattern q = Pattern.compile("WIFLYMODULE-[0-9]{4}");

The pattern breaks down to:

WIFLYMODULE-         The literal string WIFLYMODULE-
[0-9]{4}             Exactly four digits

What you had was:

[WIFLYMODULE]        Any one of the characters in WIFLYMODULE
-                    The literal string -
[0-9]{3}             Exactly three digits

Upvotes: 1

MrTux
MrTux

Reputation: 33993

[...] means that one character out of the ones in the bracket must match and not the string within it.

You, however, want to match WIFLYMODULE, thus, you have to use Pattern.compile("WIFLYMODULE-[0-9]{3}"); or Pattern.compile("(WIFLYMODULE)-[0-9]{3}");

{n} means that the character (or group) must match n-times. In your example you need 4 instead of 3: Pattern.compile("WIFLYMODULE-[0-9]{4}");

Upvotes: 1

forgivenson
forgivenson

Reputation: 4435

You had it match on 3 digits instead of 4. And putting WIFLYMODULE inside [] makes it match on only one of those characters.

final Pattern q = Pattern.compile("WIFLYMODULE-[0-9]{4}");

Upvotes: 1

enrico.bacis
enrico.bacis

Reputation: 31484

The regex should be:

"WIFLYMODULE-[0-9]{4}"

The square brackets means: one of the characters listed inside. Also you were matching three numbers instead of four. So your were matching strings like (where xxx is a number of three digits):

W-xxx, I-xxx, F-xxx, L-xxx, Y-xxx, M-xxx, O-xxx, D-xxx, U-xxx, L-xxx, E-xxx

Upvotes: 1

Related Questions