Obtenga el índice de un patrón en una cadena usando expresiones regulares
90
Quiero buscar una cadena para un patrón específico.
¿Las clases de expresión regular proporcionan las posiciones (índices dentro de la cadena) del patrón dentro de la cadena?
Puede haber más de 1 apariciones del patrón.
¿Algún ejemplo práctico?
¡Por favor comente al votar en contra! @Shadow Supongo que esto ha sido rechazado ya que, como la solicitud de OP, no da el índice de la coincidencia ...
El Ronnoco
4
Bien ... voté en contra porque esta respuesta no aborda la pregunta.
3
Tu expresión regular también es defectuosa. El primero (.*)originalmente consume toda la cadena, luego retrocede lo suficiente para permitir que (\d+)coincida con un dígito, dejando luego el segundo (.*)para consumir lo que quede. No es un resultado particularmente útil, diría yo. Ah, y te quedaste group(3)fuera de tus resultados.
Respuestas:
Usar 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()); } }
fuente
respuesta de edición especial de 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}; }
fuente
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"); } } }
Resultado
Found value: This order was places for QT3000! OK? Found value: This order was places for QT300 Found value: 0
fuente
(.*)
originalmente consume toda la cadena, luego retrocede lo suficiente para permitir que(\d+)
coincida con un dígito, dejando luego el segundo(.*)
para consumir lo que quede. No es un resultado particularmente útil, diría yo. Ah, y te quedastegroup(3)
fuera de tus resultados.