rvd
rvd

Reputation: 337

Regex pattern matcher

I have a string : 154545K->12345K(524288K)

Suppose I want to extract numbers from this string.

The string contains the group 154545 at position 0, 12345 at position 1 and 524288 at position 2.

Using regex \\d+, I need to extract 12345 which is at position 1.

I am getting the desired result using this :

String lString = "154545K->12345K(524288K)";
Pattern lPattern = Pattern.compile("\\d+");
Matcher lMatcher = lPattern.matcher(lString);
String lOutput = "";
int lPosition = 1;
int lGroupCount = 0;
while(lMatcher.find()) {
    if(lGroupCount == lPosition) {
    lOutput = lMatcher.group();
    break;
}
else {
    lGroupCount++;
}
}
System.out.println(lOutput);

But, is there any other simple and direct way to achieve this keeping the regex same \\d+(without using the group counter)?

Upvotes: 1

Views: 107

Answers (2)

Boris Brodski
Boris Brodski

Reputation: 8695

If you expect your number to be at the position 1, then you can use find(int start) method like this

if (lMatcher.find(1) && lMatcher.start() == 1) {
    // Found lMatcher.group()
}

You can also convert your loop into for loop to get ride of some boilerplate code

String lString = "154540K->12341K(524288K)";
Pattern lPattern = Pattern.compile("\\d+");
Matcher lMatcher = lPattern.matcher(lString);


int lPosition = 2;
for (int i = 0; i < lPosition && lMatcher.find(); i++) {}

if (!lMatcher.hitEnd()) {
    System.out.println(lMatcher.group());
}

Upvotes: 1

Evgeniy Dorofeev
Evgeniy Dorofeev

Reputation: 135992

try this

String d1 = "154545K->12345K(524288K)".replaceAll("(\\d+)\\D+(\\d+).*", "$1");

Upvotes: 1

Related Questions