Java: วิธีการรับตำแหน่งการแข่งขันใน String หรือไม่


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

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

คำตอบ:


259

ตระกูลของวิธีการที่เป็นเช่นนี้:

ส่งคืนดัชนีภายในสตริงของการเกิดขึ้นครั้งแรก ( หรือครั้งสุดท้าย ) ของสตริงย่อยที่ระบุ [ค้นหาไปข้างหน้า ( หรือย้อนหลัง ) เริ่มต้นที่ดัชนีที่ระบุ]


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 เพิ่งรับรู้การมอบหมายภายใน while-loop จากนั้นคุณโพสต์การมอบหมายภายใน for-loop +1
hhh

4
@polygenelubricants - ตัวอย่าง "ค้นหาทั้งหมดที่เกิดขึ้น" ของคุณนั้นฉลาด แต่ถ้าเป็นการทบทวนโค้ดคุณจะได้รับการบรรยายเกี่ยวกับการบำรุงรักษาโค้ด
สตีเฟ่นซี

3
คุณจะเขียนมันอย่างไร ฉันถามด้วยความจริงใจเพราะฉันไม่เคยมีประสบการณ์การตรวจสอบโค้ดอย่างมืออาชีพมาก่อน
polygenelubricants

1
ในการค้นหาสิ่งที่เกิดขึ้นทั้งหมดแทนที่จะเป็น i ++ เราสามารถเขียน i + = word.length () มันควรจะเร็วขึ้นเล็กน้อย
พฤษภาคมพักอย่างสงบ

วงแรกจะล้มเหลวในการค้นหาตำแหน่งทั้งหมดถ้าจับคู่หนึ่งตัวอักษร คุณไม่จำเป็นต้อง +1 ในสำหรับคำสั่ง loop Second เนื่องจากคำสั่งที่สามนับ i ++ ให้ลองใช้ String text = "0011100"; คำที่ตรงกับถ่าน "1" มันจะพิมพ์ 2,4 ไม่ใช่ 2,3,4
Strauteka

40

งานนี้ใช้ 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));
}

ผลผลิต:

พบ 'ความรัก' ที่ดัชนี 2 - 5

กฎทั่วไป :

  • Regex ค้นหาจากซ้ายไปขวาและเมื่อมีการใช้อักขระการจับคู่แล้วจะไม่สามารถใช้ซ้ำได้

19
มันใช้งานได้ดี แต่สำหรับประโยคนี้ฉันได้ผลลัพธ์ว่า "ฉันมีแฟน" :-)
Gaurav Pangam


8

การค้นหาดัชนีเดี่ยว

อย่างที่คนอื่นพูดกันใช้text.indexOf(match)เพื่อหาคู่ที่ตรงกัน

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

การค้นหาหลายดัชนี

เนื่องจากความคิดเห็นของ@ StephenCเกี่ยวกับการบำรุงรักษาโค้ดและความยากลำบากในการเข้าใจคำตอบ @polygenelubricants ของฉันจึงต้องการหาวิธีอื่นในการรับดัชนีทั้งหมดของการแข่งขันในสตริงข้อความ รหัสต่อไปนี้ (ซึ่งแก้ไขจากคำตอบนี้ ) ทำเช่นนั้น:

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

คุณสามารถรับการแข่งขันทั้งหมดในไฟล์เพียงแค่กำหนดในขณะที่ลูปเท่:

$ 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
วิธีที่คุณชดเชยiด้วยการ+1ทำงาน แต่ในทางอ้อม ในขณะที่คุณได้แสดงที่นี่จะรายงานเป็นครั้งแรกที่hello i == 1มีความสอดคล้องกันมากขึ้นถ้าคุณใช้การจัดทำดัชนีแบบ 0 เสมอ
polygenelubricants

1
... จะขโมยสิ่งของของคุณ: P ขอบคุณ
hhh

2
int match_position=text.indexOf(match);

1
โปรดอธิบายสิ่งที่คุณทำ
Fabio

1
@Fabio getPosition (การจับคู่ข้อความ) {int match_position = text.indexOf (การจับคู่); 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);
  }
}

1
คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงได้ผลและสิ่งที่เกิดขึ้นในยามของวงใน? คำอธิบายอาจเป็นประโยชน์สำหรับผู้อ่านมือใหม่
พอลฮิกส์

1
int indexOf (String str, int fromIndex): ส่งคืนดัชนีภายในสตริงนี้ของการเกิดขึ้นครั้งแรกของสตริงย่อยที่ระบุเริ่มต้นที่ดัชนีที่ระบุ หากไม่เกิดขึ้น -1 จะถูกส่งคืน นี่คือวงในของขณะที่จะสามารถรับการกำเนิดของโทเค็นทั้งหมด (ที่นี่ระบุโดยตัวแปรชื่อเป็น 'กุญแจ')
Khan

1

ฉันมีรหัสขนาดใหญ่ แต่ทำงานได้ดี ....

   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
ใส่คำอธิบาย / ความคิดเห็นลงในโค้ดของคุณจะทำให้ผู้คนเข้าใจโค้ดของคุณได้ง่ายขึ้นโดยเฉพาะรหัสที่ยาว :)
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
ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Peter Brittain


0

หากคุณกำลังจะสแกนหา 'n' ตรงกับของสตริงการค้นหาผมขอแนะนำให้ใช้การแสดงออกปกติ พวกเขามีช่วงการเรียนรู้ที่สูงชัน แต่พวกเขาจะช่วยคุณประหยัดเวลาในการค้นหาที่ซับซ้อน


2
คำแนะนำ: รวมตัวอย่างของการรับตำแหน่งจากนิพจน์ทั่วไป เพียงแค่ "ลองใช้นิพจน์ทั่วไป" เป็นความคิดเห็นพื้นฐานและไม่ตอบคำถามของ OP
Brad Koch

0

สำหรับการเกิดขึ้นหลายครั้งและอักขระที่พบในสตริง ?? ใช่หรือไม่ใช่

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

หวังว่ามันจะแก้ปัญหาได้ แต่โปรดเพิ่มคำอธิบายของรหัสของคุณด้วยเพื่อที่ผู้ใช้จะได้รับความเข้าใจที่สมบูรณ์แบบซึ่งเขา / เธอต้องการจริงๆ
Jaimil Patel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.