자바 : 문자열에서 일치하는 위치를 얻는 방법?


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- "모든 항목 찾기"예제는 영리합니다. 그러나 코드를 검토 한 경우 코드 유지 관리성에 대한 강의를 받게됩니다.
Stephen C

3
어떻게 쓰시겠습니까? 나는 전문적인 코드 검토 경험이 없었기 때문에 솔직히 묻습니다.
polygenelubricants

1
i ++ 대신 모든 어커런스 찾기에서 i + = word.length ()를 작성할 수 있습니다. 약간 빨라야합니다.
5

첫 번째 루프는 하나의 문자와 일치하면 모든 위치를 찾지 못합니다. 세 번째 명령문은 i ++를 계산하기 때문에 +1 루프 루프 명령문에는 +1이 필요하지 않습니다. String text = "0011100"; 일치하는 단어 char "1"2,3,4가 아닌 2,4를 인쇄합니다
Strauteka

40

이것은 정규식을 사용하여 작동합니다.

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에서 '사랑'을 찾았습니다

일반 규칙 :

  • 정규식 검색은 왼쪽에서 오른쪽으로 이루어지며 일치하는 문자를 사용한 후에는 재사용 할 수 없습니다.

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

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
당신이 상쇄 i하는 +1방식은 효과가 있지만 다소 우회적입니다. 여기에 표시된대로 첫 번째 hello에 보고합니다 i == 1. 항상 0 기반 인덱싱을 사용하면 훨씬 일관성이 있습니다.
polygenelubricants 2

1
... 당신의 것을 훔칠 것입니다 : P 감사합니다.
hhh

2
int match_position=text.indexOf(match);

1
당신이 한 일을 설명해주세요
Fabio

1
@Fabio getPosition (일치, 텍스트) {int match_position = text.indexOf (match); match_position를 반환;}
사예드

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
왜 이것이 효과가 있고 내부 루프의 보호대에서 일어나고 있는지 설명 할 수 있습니까? 설명은 초보자에게 유용 할 수 있습니다.
Paul Hicks 2019

1
int indexOf (String str, int fromIndex) : 지정된 인덱스에서 시작하여, 지정된 문자열에서 처음 나타나는이 문자열 내의 인덱스를 반환합니다. 발생하지 않으면 -1이 리턴됩니다. 여기서 while의 내부 루프는 token의 모든 공간을 얻을 수 있습니다 (여기서는 'key'라는 변수로 지정).

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

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

검색 문자열에서 '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.