Obtenha o índice de um padrão em uma string usando regex
91
Quero pesquisar uma string para um padrão específico.
As classes de expressão regular fornecem as posições (índices dentro da string) do padrão dentro da string?
Pode haver mais de 1 ocorrência do padrão.
Algum exemplo prático?
Por favor, comente quando fizer downvoting! @Shadow Suponho que tenha sido rejeitado porque não dá, como pedido de OP, o índice da correspondência ...
El Ronnoco
4
Ok ... Eu votei contra porque essa resposta não aborda a questão.
3
Seu regex também está com defeito. O primeiro (.*)consome originalmente toda a string, depois recua apenas o suficiente para permitir a (\d+)correspondência de um dígito, deixando o segundo (.*)para consumir o que resta. Não é um resultado particularmente útil, eu diria. Ah, e você deixou de group(3)fora seus resultados.
Respostas:
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()); } }
fonte
resposta da edição 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}; }
fonte
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
fonte
(.*)
consome originalmente toda a string, depois recua apenas o suficiente para permitir a(\d+)
correspondência de um dígito, deixando o segundo(.*)
para consumir o que resta. Não é um resultado particularmente útil, eu diria. Ah, e você deixou degroup(3)
fora seus resultados.