Java: metodo per ottenere la posizione di una corrispondenza in una stringa?


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

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

Risposte:


259

La famiglia di metodi che fa questo sono:

Restituisce l'indice all'interno di questa stringa della prima ( o ultima ) occorrenza della sottostringa specificata [ricerca in avanti ( o indietro ) a partire dall'indice specificato].


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"

2
lolz, hai appena realizzato un incarico all'interno di while-loop, quindi pubblichi un incarico all'interno di for-loop +1
hhh

4
@polygenelubricants: i tuoi esempi "trova tutte le occorrenze" sono intelligenti. Ma se lo revisionassi, riceverai una lezione sulla manutenibilità del codice.
Stephen C

3
Come lo scriveresti? Lo sto chiedendo onestamente, perché non ho mai avuto un'esperienza professionale di revisione del codice.
poligenelubrificanti

1
Nel trovare tutte le occorrenze, invece di i ++, possiamo scrivere i + = word.length (). Dovrebbe essere leggermente più veloce.
Riposa in pace il

Il primo ciclo non riuscirà a trovare tutte le posizioni se corrisponde a un carattere. Non è necessario +1 in per la seconda istruzione del ciclo, poiché la terza istruzione conta i ++ prova per String text = "0011100"; parola corrispondente "1" stampa 2,4 non 2,3,4
Strauteka

40

Funziona con regex.

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));
}

Produzione :

Trovato "amore" nell'indice 2 - 5

Regola generale :

  • Ricerca Regex da sinistra a destra e, una volta utilizzati i caratteri di corrispondenza, non possono essere riutilizzati.

19
Funziona benissimo, ma per questa frase ho ottenuto l'uscita che diceva "I have a boyfriend" :-)
Gaurav Pangam


8

Trovare un singolo indice

Come altri hanno già detto, usa text.indexOf(match)per trovare una singola corrispondenza.

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

Trovare più indici

A causa del commento di @SteCC sulla manutenibilità del codice e sulla mia difficoltà a comprendere la risposta di @polygenelubricants , volevo trovare un altro modo per ottenere tutti gli indici di una corrispondenza in una stringa di testo. Il seguente codice (che viene modificato da questa risposta ) lo fa:

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);
}


2

Puoi ottenere tutte le partite in un file semplicemente assegnando all'interno while-loop, cool:

$ 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);
    }
}

2
Il modo in cui si compensata ida +1opere, ma in un modo piuttosto rotonda. Come hai mostrato qui, riporta il primo helloall'indirizzo i == 1. È molto più coerente se si utilizza sempre l'indicizzazione basata su 0.
poligenelubrificanti

1
... ruberà la tua cosa: P Grazie.
hhh

2
int match_position=text.indexOf(match);

1
Per favore, spiega cosa hai fatto
Fabio

1
@Fabio getPosition (match, text) {int match_position = text.indexOf (match); tornare match_position;}
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);
  }
}

1
Puoi spiegare perché questo funziona e cosa succede nella guardia del circuito interno? Una spiegazione potrebbe essere utile per un lettore alle prime armi.
Paul Hicks,

1
int indexOf (String str, int fromIndex): restituisce l'indice all'interno di questa stringa della prima occorrenza della sottostringa specificata, a partire dall'indice specificato. Se non si verifica, viene restituito -1. Qui il ciclo interno di while sarebbe in grado di ottenere tutta l'occorrenza del token (qui specificato dalla variabile denominata 'chiave').
Khan,

1

Ho un po 'di codice grande ma funziona bene ....

   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;

                 }   
                }                 
              }  
           }  
         }
       }

2
mettere qualche spiegazione / commento nel tuo codice renderà le persone più facili da capire il tuo codice in particolare è un codice lungo :)
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);

    }
}

3
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
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);

0

Se stai per cercare le corrispondenze 'n' della stringa di ricerca, ti consiglio di usare espressioni regolari . Hanno una ripida curva di apprendimento, ma ti faranno risparmiare ore quando si tratta di ricerche complesse.


2
Suggerimento: includi un esempio di come ottenere la posizione da un'espressione regolare. Solo "provare a usare espressioni regolari" è un commento piuttosto semplice e non risponde alla domanda del PO.
Brad Koch,

0

per più occorrenze e il carattere trovato nella stringa ?? yes or 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);
    }


    }

}

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;
}

Spero che risolva il problema, ma per favore aggiungi una spiegazione del tuo codice con esso in modo che l'utente possa capire perfettamente ciò che desidera davvero.
Jaimil Patel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.