I am new to Java concept of Regular expression.
Could anyone please tell me the correct regular expression that I should use for the below string -
String exp = "ABCD_123_abc".
and the regular expression that I am using for the above string is:
regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)"
But the output of the below code is "**No Match Found**"
Public static void main()
{
String exp = "ABCD_123_abc";
String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";
Pattern pattern = Pattern.compile(exp);
Matcher matcher = pattern.matcher(regExp);
if(matcher.matches())
{
System.out.println("Match found");
}
else
{
System.out.println(" NO Match found");
}
}
The problem is: you accidentally swapped the use of the regexp pattern and the expression to check
String exp = "ABCD_123_abc";
String regExp = "([a-zA-Z]+)_([0-9]+)_([a-z]+)";
Should be used
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);
The Pattern.compile(String regex) function accepts the regular expression.
EDIT
I apologize, my first solution was truly something that must never ever, never ever be done: the names of the variables were contradictory to the meaning of their values... That means pain and tears, and getting hit by angry colleagues while being shouted at. And there is no valid defense to this crime...
EDIT2 You can get the individual matched groups by the Matcher.group(int) function:
String matchedStringpart matcher.group(2);
Notice: I used 2
as the argument:
0
means the input sequence matched1
means the first group (ABC
in this case)If you only need the 123
part, I'd rewrite the regex for clarity:
regExp = "[a-zA-Z]+_([0-9]+)_[a-z]+";
However, in that case, the group()
has to be called with 1
, as now the first (and only) matched group is the first one:
String matchedStringpart matcher.group(1);
You're not compiling the regexp. You need
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(exp);
i.e. your above code is confusing the regexp and the input string. Your actual regexp is correct, however.
Your regex is perfectly fine.
The problem comes from the fact that you swapped exp
and regExp
in your code. The function compile
takes as argument a regular expression, whereas the function matcher
takes the expression to match.
Your (edited) regexp is fine.
If you want to extract 123
, you can use matcher.group(2)
. That method can only be invoked after matches
or find
. matcher.group(n)
returns the n-th capture group
. A capture group is a part of your regexp that is enclosed in parentheses. matcher.group(0)
returns the matched string.
Example
if(matcher.matches()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
prints
ABCD_123_abc
ABCD
123
abc
if(exp.matches(regExp))
This alone is enough. You don't need a Pattern/Matcher unless you've some other needs.
In this case if you want to retrieve 123 use the following code :
System.out.println(matcher.group(2));
This prints output as : 123
Your regex is perfectly fine.
This pattern will work - it matches any number of upper or lower case letter then an underscore then any number of digits then an underscore then any number of upper or lower case letters. If you want to be more specific you can use {n}
rather than +
to match a specific number of characters.
public static void main(String[] args) {
final String myString = "ABCD_123_abc";
final Pattern p = Pattern.compile("^[A-Za-z]++_(\\d++)_[A-Za-z]++$");
final Matcher matcher = p.matcher(myString);
if (matcher.matches()) {
System.out.println(matcher.group(1));
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With