Get the index of a pattern in a string using regex
Asked Answered
F

3

111

I want to search a string for a specific pattern.

Do the regular expression classes provide the positions (indexes within the string) of the pattern within the string?
There can be more that 1 occurences of the pattern.
Any practical example?

Fumikofumitory answered 20/1, 2012 at 8:19 Comment(1)
G
206

Use Matcher:

public static void printMatches(String text, String regex) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    // Check all occurrences
    while (matcher.find()) {
        System.out.print("Start index: " + matcher.start());
        System.out.print(" End index: " + matcher.end());
        System.out.println(" Found: " + matcher.group());
    }
}
Gunny answered 20/1, 2012 at 8:23 Comment(0)
L
6

special edition answer from Jean Logeart

public static int[] regExIndex(String pattern, String text, Integer fromIndex){
    Matcher matcher = Pattern.compile(pattern).matcher(text);
    if ( ( fromIndex != null && matcher.find(fromIndex) ) || matcher.find()) {
        return new int[]{matcher.start(), matcher.end()};
    }
    return new int[]{-1, -1};
}
Larimer answered 1/6, 2017 at 20:56 Comment(0)
D
-3
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // String to be scanned to find the pattern.
      String line = "This order was places for QT3000! OK?";
      String pattern = "(.*)(\\d+)(.*)";

      // Create a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Now create matcher object.
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

Result

Found value: This order was places for QT3000! OK?
Found value: This order was places for QT300
Found value: 0
Dirtcheap answered 20/1, 2012 at 8:24 Comment(4)
Please comment when downvoting! @Dirtcheap I assume this has been downvoted as it does not, as the OP request, give the index of the match...Kacerek
Okay... I downvoted because this answer does not address the question.Mcmullin
Your regex is faulty, too. The first (.*) originally consumes the whole string, then it backs off just far enough to let (\d+) match one digit, leaving then the second (.*) to consume whatever's left. Not a particularly useful result, I'd say. Oh, and you left group(3) out of your results.Snowdrop
Doesn't give the indexInstrumentalism

© 2022 - 2024 — McMap. All rights reserved.