Java: metode untuk mendapatkan posisi kecocokan dalam sebuah String?

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

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

Jawaban:

259

Keluarga metode yang melakukan ini adalah:

Mengembalikan indeks dalam string ini dari kemunculan pertama ( atau terakhir ) dari substring yang ditentukan [mencari maju ( atau mundur ) mulai dari indeks yang ditentukan].


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"
polygenelubricants
sumber
2
lolz, baru saja menyadari sebuah tugas di dalam while-loop, maka Anda memposting tugas di dalam untuk-loop +1
hhh
4
@polygenelubricants - contoh "temukan semua kejadian" Anda cerdas. Tetapi jika sedang meninjau kode itu, Anda akan mendapatkan kuliah tentang pemeliharaan kode.
Stephen C
3
Bagaimana Anda akan menulisnya? Saya jujur ​​bertanya, karena saya belum pernah memiliki pengalaman tinjauan kode profesional sebelumnya.
polygenelubricants
1
Dalam menemukan semua kejadian, alih-alih i ++, kita dapat menulis i + = word.length (). Seharusnya sedikit lebih cepat.
May Rest in Peace
Loop pertama akan gagal menemukan semua posisi jika cocok dengan satu karakter. Anda tidak perlu +1 dalam untuk pernyataan kedua loop, karena pernyataan ketiga menghitung i ++ mencoba untuk String teks = "0011100"; kata yang cocok char "1" itu akan mencetak 2,4 tidak 2,3,4
Strauteka
40

Ini bekerja menggunakan 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));
}

Output:

Ditemukan 'cinta' di indeks 2 - 5

Peraturan umum :

  • Regex search dari kiri ke kanan, dan setelah karakter yang cocok digunakan, itu tidak dapat digunakan kembali.
Aldwane Viegan
sumber
19
Ini bekerja luar biasa, tetapi untuk kalimat ini saya mendapatkan output yang mengatakan "Saya punya pacar" :-)
Gaurav Pangam
8

Menemukan indeks tunggal

Seperti yang orang lain katakan, gunakan text.indexOf(match)untuk menemukan satu kecocokan.

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

Menemukan banyak indeks

Karena komentar @ StephenC tentang perawatan kode dan kesulitan saya sendiri dalam memahami jawaban @polygenelubricants , saya ingin mencari cara lain untuk mendapatkan semua indeks kecocokan dalam string teks. Kode berikut (yang dimodifikasi dari jawaban ini ) melakukannya:

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
sumber
2

Gunakan string.indexOf untuk mendapatkan indeks awal.

Anthony Pegram
sumber
2

Anda bisa mendapatkan semua kecocokan dalam file hanya dengan menetapkan di dalam while-loop, keren:

$ 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
sumber
2
Cara Anda mengimbangi idengan +1bekerja, tetapi dengan cara yang agak bundar. Seperti yang Anda tunjukkan di sini, ia melaporkan yang pertama hellodi i == 1. Ini jauh lebih konsisten jika Anda selalu menggunakan pengindeksan berbasis 0.
polygenelubricants
1
... akan mencuri barangmu: P Terima kasih.
hhh
2
int match_position=text.indexOf(match);
Dikatakan
sumber
1
Tolong jelaskan apa yang Anda lakukan
Fabio
1
@Fabio getPosition (kecocokan, teks) {int match_position = text.indexOf (kecocokan); return 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);
  }
}
Khan
sumber
1
Bisakah Anda menjelaskan mengapa ini berhasil dan apa yang terjadi dalam menjaga lingkaran dalam? Penjelasan mungkin bermanfaat bagi pembaca pemula.
Paul Hicks
1
int indexOf (String str, int fromIndex): Mengembalikan indeks dalam string ini dari kemunculan pertama dari substring yang ditentukan, mulai dari indeks yang ditentukan. Jika tidak terjadi, -1 dikembalikan. Di sini loop bagian dalam sementara akan bisa mendapatkan semua sumber dari token (di sini ditentukan oleh variabel bernama 'kunci').
Khan
1

Saya punya beberapa kode besar tetapi berfungsi dengan baik ....

   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
sumber
2
letakkan penjelasan / komentar dalam kode Anda akan membuat orang lebih mudah untuk memahami kode Anda terutama kode panjang :)
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
sumber
3
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
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
sumber
0

Jika Anda akan memindai untuk kecocokan n 'dari string pencarian, saya akan merekomendasikan menggunakan ekspresi reguler . Mereka memiliki kurva belajar yang curam, tetapi mereka akan menghemat waktu Anda saat melakukan pencarian yang rumit.

JPeraita
sumber
2
Saran: Sertakan contoh mendapatkan posisi dari ekspresi reguler. Hanya "coba gunakan ekspresi reguler" adalah komentar yang agak mendasar dan tidak menjawab pertanyaan OP.
Brad Koch
0

untuk beberapa kejadian dan karakter ditemukan dalam string ?? ya atau tidak

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
sumber
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
sumber
Berharap itu akan menyelesaikan masalah tetapi tolong tambahkan penjelasan kode Anda dengan itu sehingga pengguna akan mendapatkan pemahaman yang sempurna yang ia benar-benar inginkan.
Jaimil Patel