Java: Methode zum Abrufen der Position einer Übereinstimmung in einem String?


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

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

Antworten:


258

Die Methodenfamilie, die dies tut, ist:

Gibt den Index innerhalb dieser Zeichenfolge des ersten ( oder letzten ) Auftretens des angegebenen Teilstrings zurück [Suche vorwärts ( oder rückwärts ) beginnend mit dem angegebenen Index].


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, habe gerade eine Aufgabe innerhalb der while-Schleife realisiert, dann
postest

4
@polygenelubricants - Ihre Beispiele für "Alle Vorkommen finden" sind clever. Wenn Sie dies jedoch mit Code überprüfen würden, würden Sie einen Vortrag über die Wartbarkeit von Code erhalten.
Stephen C

3
Wie würdest du es schreiben? Ich frage ehrlich, weil ich vorher noch keine professionelle Codeüberprüfung gemacht habe.
Polygenschmierstoffe

1
Um alle Vorkommen zu finden, können wir anstelle von i ++ i + = word.length () schreiben. Es sollte etwas schneller sein.
in Frieden

Die erste Schleife findet nicht alle Positionen, wenn sie mit einem Zeichen übereinstimmt. Sie brauchen nicht +1 in für die zweite Anweisung der Schleife, da die dritte Anweisung i ++ zählt. Try for String text = "0011100"; passendes Wort char "1" druckt 2,4 nicht 2,3,4
Strauteka

40

Dies funktioniert mit 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));
}

Ausgabe :

Gefunden 'Liebe' bei Index 2 - 5

Allgemeine Regel :

  • Regex-Suche von links nach rechts, und sobald die Übereinstimmungszeichen verwendet wurden, können sie nicht mehr verwendet werden.

19
Das funktioniert super, aber für diesen Satz bekam ich die Ausgabe "Ich habe einen Freund" :-)
Gaurav Pangam


8

Einen einzelnen Index finden

Wie andere gesagt haben, verwenden Sie text.indexOf(match), um eine einzelne Übereinstimmung zu finden.

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

Mehrere Indizes finden

Aufgrund des Kommentars von @ StephenC zur Wartbarkeit von Code und meiner eigenen Schwierigkeit , die Antwort von @polygenelubricants zu verstehen , wollte ich einen anderen Weg finden, um alle Indizes einer Übereinstimmung in einer Textzeichenfolge abzurufen. Der folgende Code (der von dieser Antwort geändert wird ) tut dies:

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

Sie können alle Übereinstimmungen in einer Datei erhalten, indem Sie einfach innerhalb der while-Schleife zuweisen, 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
Die Art und Weise, wie Sie idurch +1arbeiten, funktioniert, aber auf ziemlich umständliche Weise. Wie Sie hier gezeigt haben, wird der erste hellobei gemeldet i == 1. Es ist viel konsistenter, wenn Sie immer eine 0-basierte Indizierung verwenden.
Polygenschmierstoffe

1
... wird dein Ding stehlen: P Danke.
hhh

2
int match_position=text.indexOf(match);

1
Bitte erklären Sie, was Sie getan haben
Fabio

1
@Fabio getPosition (Übereinstimmung, Text) {int match_position = text.indexOf (Übereinstimmung); return match_position;}
Sagte

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
Können Sie erklären, warum dies funktioniert und was in der Wache der inneren Schleife vor sich geht? Eine Erklärung kann für Anfänger hilfreich sein.
Paul Hicks

1
int indexOf (String str, int fromIndex): Gibt den Index innerhalb dieses Strings des ersten Auftretens des angegebenen Teilstrings zurück, beginnend mit dem angegebenen Index. Wenn dies nicht der Fall ist, wird -1 zurückgegeben. Hier könnte die innere Schleife von while die gesamte Tokenquelle abrufen (hier angegeben durch die als 'Schlüssel' bezeichnete Variable).
Khan

1

Ich habe einen großen Code, arbeite aber gut ...

   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
Wenn

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
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
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

Wenn Sie nach 'n' Übereinstimmungen der Suchzeichenfolge suchen möchten, würde ich die Verwendung regulärer Ausdrücke empfehlen . Sie haben eine steile Lernkurve, aber sie sparen Ihnen Stunden, wenn es um komplexe Suchvorgänge geht.


2
Vorschlag: Fügen Sie ein Beispiel für das Abrufen der Position aus einem regulären Ausdruck hinzu. Nur "versuchen, reguläre Ausdrücke zu verwenden" ist ein ziemlich grundlegender Kommentar und beantwortet die Frage des OP nicht.
Brad Koch

0

für mehrfaches Auftreten und das in der Zeichenfolge gefundene Zeichen? Ja oder Nein

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

Hoffe, es wird das Problem lösen, aber bitte fügen Sie eine Erklärung Ihres Codes hinzu, damit der Benutzer ein perfektes Verständnis dafür erhält, was er wirklich will.
Jaimil Patel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.