Ruft den Index eines Musters in einer Zeichenfolge mithilfe von Regex ab

87

Ich möchte eine Zeichenfolge nach einem bestimmten Muster durchsuchen.

Geben die Klassen für reguläre Ausdrücke die Positionen (Indizes innerhalb der Zeichenfolge) des Musters innerhalb der Zeichenfolge an?
Es kann mehr als 1 Vorkommen des Musters geben.
Irgendein praktisches Beispiel?

Cratylus
quelle

Antworten:

162

Verwendung 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());
    }
}
Jean Logeart
quelle
5

Sonderausgabe Antwort von 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};
}
Ar maj
quelle
-2
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");
      }
   }
}

Ergebnis

Found value: This order was places for QT3000! OK?
Found value: This order was places for QT300
Found value: 0
Schatten
quelle
2
Bitte kommentieren Sie beim Downvoting! @ Schatten Ich gehe davon aus, dass dies herabgestimmt wurde, da es nicht als OP-Anfrage den Index des Spiels gibt ...
El Ronnoco
4
Okay ... Ich habe abgelehnt, weil diese Antwort die Frage nicht beantwortet.
3
Ihre Regex ist auch fehlerhaft. Der erste (.*)verbraucht ursprünglich die gesamte Zeichenfolge, dann zieht er sich gerade so weit zurück, dass (\d+)eine Ziffer übereinstimmt, und der zweite (.*)verbraucht alles, was noch übrig ist. Kein besonders nützliches Ergebnis, würde ich sagen. Oh, und du hast group(3)deine Ergebnisse ausgelassen.
Alan Moore
2
Gibt nicht den Index
piratemurray