Java: ¿método para obtener la posición de una coincidencia en una cadena?

138
String match = "hello";
String text = "0123456789hello0123456789";

int position = getPosition(match, text); // should be 10, is there such a method?
hhh
fuente

Respuestas:

259

La familia de métodos que hace esto son:

Devuelve el índice dentro de esta cadena de la primera ( o última ) aparición de la subcadena especificada [buscando hacia adelante ( o hacia atrás ) comenzando en el índice especificado].


String text = "0123hello9012hello8901hello7890";
String word = "hello";

System.out.println(text.indexOf(word)); // prints "4"
System.out.println(text.lastIndexOf(word)); // prints "22"

// find all occurrences forward
for (int i = -1; (i = text.indexOf(word, i + 1)) != -1; i++) {
    System.out.println(i);
} // prints "4", "13", "22"

// find all occurrences backward
for (int i = text.length(); (i = text.lastIndexOf(word, i - 1)) != -1; i++) {
    System.out.println(i);
} // prints "22", "13", "4"
poligenelubricantes
fuente
2
lolz, acabo de realizar una tarea dentro de while-loop, luego publicas una tarea dentro de for-loop +1
hhh
44
@polygenelubricants: sus ejemplos de "buscar todas las ocurrencias" son inteligentes. Pero si estaba revisando el código eso, obtendría una conferencia sobre la mantenibilidad del código.
Stephen C
3
¿Cómo lo escribirías? Honestamente pregunto, porque no he tenido una experiencia profesional de revisión de código antes.
polygenelubricants
1
En buscar todas las ocurrencias, en lugar de i ++, podemos escribir i + = word.length (). Debería ser un poco más rápido.
Puede descansar en paz
El primer bucle no podrá encontrar todas las posiciones si coincide con un carácter. No necesita +1 para la segunda instrucción del bucle, porque la tercera instrucción cuenta i ++ intente con String text = "0011100"; palabra coincidente char "1" imprimirá 2,4 no 2,3,4
Strauteka
40

Esto funciona usando expresiones regulares.

String text = "I love you so much";
String wordToFind = "love";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(text);

while (match.find()) {
     System.out.println("Found love at index "+ match.start() +" - "+ (match.end()-1));
}

Salida:

Encontrado 'amor' en el índice 2 - 5

Regla general :

  • Regex busca de izquierda a derecha, y una vez que se han utilizado los caracteres coincidentes, no se puede reutilizar.
Aldwane Viegan
fuente
19
Esto funciona de maravilla, pero para esta oración obtuve la salida diciendo "Tengo novio" :-)
Gaurav Pangam
8

Encontrar un solo índice

Como han dicho otros, use text.indexOf(match)para encontrar una sola coincidencia.

String text = "0123456789hello0123456789";
String match = "hello";
int position = text.indexOf(match); // position = 10

Encontrar múltiples índices

Debido al comentario de @ StephenC sobre el mantenimiento del código y mi propia dificultad para comprender la respuesta de @polygenelubricants , quería encontrar otra forma de obtener todos los índices de una coincidencia en una cadena de texto. El siguiente código (que se modifica a partir de esta respuesta ) lo hace:

String text = "0123hello9012hello8901hello7890";
String match = "hello";

int index = text.indexOf(match);
int matchLength = match.length();
while (index >= 0) {  // indexOf returns -1 if no match found
    System.out.println(index);
    index = text.indexOf(match, index + matchLength);
}
Suragch
fuente
2

Use string.indexOf para obtener el índice inicial.

Anthony Pegram
fuente
2

Puede obtener todas las coincidencias en un archivo simplemente asignando dentro while-loop, genial:

$ javac MatchTest.java 
$ java MatchTest 
1
16
31
46
$ cat MatchTest.java 
import java.util.*;
import java.io.*;

public class MatchTest {
    public static void main(String[] args){
        String match = "hello";
        String text = "hello0123456789hello0123456789hello1234567890hello3423243423232";
        int i =0;
        while((i=(text.indexOf(match,i)+1))>0)
            System.out.println(i);
    }
}
hhh
fuente
2
La forma en que se compensa icon las +1obras, pero de una manera indirecta. Como has mostrado aquí, informa el primero helloen i == 1. Es mucho más consistente si siempre usa indexación basada en 0.
polygenelubricants
1
... robará lo tuyo: P Gracias.
hhh
2
int match_position=text.indexOf(match);
Sayed
fuente
1
Por favor explique lo que hizo
Fabio
1
@Fabio getPosition (coincidencia, texto) {int match_position = text.indexOf (coincidencia); match_position retorno;}
Sayed
1
import java.util.StringTokenizer;

public class Occourence {

  public static void main(String[] args) {
    String key=null,str ="my name noorus my name noorus";        
    int i=0,tot=0;

    StringTokenizer st=new StringTokenizer(str," ");
    while(st.hasMoreTokens())
    {   
        tot=tot+1;
        key = st.nextToken();
        while((i=(str.indexOf(key,i)+1))>0)
        {
            System.out.println("position of "+key+" "+"is "+(i-1));
        }
    }

    System.out.println("total words present in string "+tot);
  }
}
Kan
fuente
1
¿Puedes explicar por qué esto funciona y qué está pasando en la guardia del circuito interno? Una explicación puede ser útil para un lector novato.
Paul Hicks
1
int indexOf (String str, int fromIndex): Devuelve el índice dentro de esta cadena de la primera aparición de la subcadena especificada, comenzando en el índice especificado. Si no ocurre, se devuelve -1. Aquí, el bucle interno de while podría obtener todo el origen del token (aquí especificado por la variable denominada 'clave').
Khan
1

Tengo un código grande pero funciona bien ...

   class strDemo
   { 
       public static void main(String args[])
       {
       String s1=new String("The Ghost of The Arabean Sea");
           String s2=new String ("The");
           String s6=new String ("ehT");
           StringBuffer s3;
           StringBuffer s4=new StringBuffer(s1);
           StringBuffer s5=new StringBuffer(s2);
           char c1[]=new char[30];
           char c2[]=new char[5];
           char c3[]=new char[5];
           s1.getChars(0,28,c1,0);
           s2.getChars(0,3,c2,0);
           s6.getChars(0,3,c3,0); s3=s4.reverse();      
           int pf=0,pl=0;
           char c5[]=new char[30];
           s3.getChars(0,28,c5,0);
           for(int i=0;i<(s1.length()-s2.length());i++)
           {
               int j=0;
               if(pf<=1)
               {
                  while (c1[i+j]==c2[j] && j<=s2.length())
                  {           
                    j++;
                    System.out.println(s2.length()+" "+j);
                    if(j>=s2.length())
                    {
                       System.out.println("first match of(The) :->"+i);

                     }
                     pf=pf+1;         
                  }   
             }                
       }       
         for(int i=0;i<(s3.length()-s6.length()+1);i++)
        {
            int j=0;
            if(pl<=1)
            {
             while (c5[i+j]==c3[j] && j<=s6.length())
             {
                 j++;
                 System.out.println(s6.length()+" "+j);
                 if(j>=s6.length())
                 {
                         System.out.println((s3.length()-i-3));
                         pl=pl+1;

                 }   
                }                 
              }  
           }  
         }
       }
Nitika Goswami
fuente
2
poner alguna explicación / comentario en su código hará que las personas entiendan más fácilmente su código, especialmente su código largo :)
himawan_r
1
//finding a particular word any where inthe string and printing its index and occurence  
class IndOc
{
    public static void main(String[] args) 
    {
        String s="this is hyderabad city and this is";
        System.out.println("the given string is ");
        System.out.println("----------"+s);
        char ch[]=s.toCharArray();
        System.out.println(" ----word is found at ");
        int j=0,noc=0;
        for(int i=0;i<ch.length;i++)
        {
            j=i;

            if(ch[i]=='i' && ch[j+1]=='s')
            {
                System.out.println(" index "+i);
            noc++;  
            }

        }
        System.out.println("----- no of occurences are "+noc);

    }
}
shravan
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Peter Brittain
1
    String match = "hello";
    String text = "0123456789hello0123456789hello";

    int j = 0;
    String indxOfmatch = "";

    for (int i = -1; i < text.length()+1; i++) {
        j =  text.indexOf("hello", i);
        if (i>=j && j > -1) {
            indxOfmatch += text.indexOf("hello", i)+" ";
        }
    }
    System.out.println(indxOfmatch);
Shukhrat Aliyev
fuente
0

Si va a buscar coincidencias 'n' de la cadena de búsqueda, le recomiendo usar expresiones regulares . Tienen una curva de aprendizaje abrupta, pero le ahorrarán horas cuando se trata de búsquedas complejas.

JPeraita
fuente
2
Sugerencia: Incluya un ejemplo de obtención de posición a partir de una expresión regular. Simplemente "intentar usar expresiones regulares" es un comentario bastante básico y no responde la pregunta del OP.
Brad Koch
0

para ocurrencia múltiple y el carácter encontrado en la cadena ?? sí o no

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SubStringtest {

    public static void main(String[] args)throws Exception {
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
     System.out.println("enter the string");
    String str=br.readLine();
    System.out.println("enter the character which you want");
    CharSequence ch=br.readLine();   
    boolean bool=str.contains(ch);
    System.out.println("the character found is " +bool);
    int position=str.indexOf(ch.toString());

    while(position>=0){
        System.out.println("the index no of character is " +position); 
        position=str.indexOf(ch.toString(),position+1);
    }


    }

}
Sarthak Ghosh
fuente
0
public int NumberWordsInText(String FullText_, String WordToFind_, int[] positions_)
   {
    int iii1=0;
    int iii2=0;
    int iii3=0;
    while((iii1=(FullText_.indexOf(WordToFind_,iii1)+1))>0){iii2=iii2+1;}
    // iii2 is the number of the occurences
    if(iii2>0) {
        positions_ = new int[iii2];
        while ((iii1 = (FullText_.indexOf(WordToFind_, iii1) + 1)) > 0) {
            positions_[iii3] = iii1-1;
            iii3 = iii3 + 1;
            System.out.println("position=" + positions_[iii3 - 1]);
        }
    }
    return iii2;
}
yacine
fuente
Espero que resuelva el problema, pero agregue una explicación de su código con él para que el usuario obtenga una comprensión perfecta de lo que realmente quiere.
Jaimil Patel