জাভা: কোনও স্ট্রিংয়ে ম্যাচের অবস্থান পাওয়ার পদ্ধতি?


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"


4
@ পলিজেনেলব্রিকেন্টস - আপনার "সমস্ত ঘটনা সন্ধান করুন" উদাহরণগুলি চালাক। তবে যদি কোডটি পর্যালোচনা করা হয় তবে আপনি কোড রক্ষণাবেক্ষণ সম্পর্কে একটি বক্তৃতা পাবেন।
স্টিফেন সি

3
কীভাবে লিখবেন? আমি সত্যই জিজ্ঞাসা করছি, কারণ আমার আগে কোনও পেশাদার কোড পর্যালোচনার অভিজ্ঞতা ছিল না।
বহুবৃত্তীয় পদার্থগুলি

1
সমস্ত উপস্থিতি সন্ধান করতে, i ++ এর পরিবর্তে আমরা i + = word.length () লিখতে পারি। এটি কিছুটা দ্রুত হওয়া উচিত।
শান্তিতে বিশ্রাম নিতে পারে

প্রথম লুপ একটি চরের সাথে মেলে সমস্ত অবস্থান খুঁজে পেতে ব্যর্থ হবে। লুপ দ্বিতীয় বিবৃতি জন্য আপনার +1 লাগবে না, কারণ তৃতীয় বিবৃতি স্ট্রিং পাঠ্যের জন্য i++ গণনা করে = "0011100"; "1" শব্দটির সাথে মিলছে এটি 2,4 নয় 2,3,4
স্ট্রুটেকা

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 এ 'প্রেম' পাওয়া গেছে

সাধারণ নিয়ম :

  • রেজেক্স অনুসন্ধান বাম থেকে ডানদিকে এবং একবার মিলের অক্ষর ব্যবহার করা গেলে এটি পুনরায় ব্যবহার করা যাবে না।

19
এটি দুর্দান্ত কাজ করে তবে এই বাক্যটির জন্য আমি "আমার একটি বয়ফ্রেন্ড আছে" বলে আউটপুটটি পেয়েছি :-)
গৌরব পাঙ্গম


8

একটি একক সূচক সন্ধান করা

অন্যরা যেমন বলেছে, text.indexOf(match)একটি মিল খুঁজে পেতে ব্যবহার করুন ।

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

একাধিক সূচী সন্ধান করা

কোড রক্ষণাবেক্ষণযোগ্যতা সম্পর্কে @ স্টিফেনসির মন্তব্য এবং @ পলিজেলেনব্রিকেন্টস এর উত্তর বুঝতে আমার নিজের অসুবিধা হওয়ায় আমি একটি টেক্সট স্ট্রিংয়ের সাথে ম্যাচের সমস্ত সূচী পেতে আরও একটি উপায় খুঁজে পেতে চেয়েছিলাম। নিম্নলিখিত কোড (যা এই উত্তর থেকে সংশোধিত হয় ) তা করে:

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কাজ, কিন্তু একটি বরং পরোক্ষ ভাবে। আপনি এখানে দেখানো থাকেন, এটা প্রথম রিপোর্ট helloi == 1। আপনি যদি সর্বদা 0-ভিত্তিক সূচক ব্যবহার করেন তবে এটি অনেক বেশি সামঞ্জস্যপূর্ণ।
বহুবৃক্ষের পদার্থগুলি

1
... আপনার জিনিস চুরি করবে: পি আপনাকে ধন্যবাদ।
এইচ এইচ

2
int match_position=text.indexOf(match);

1
আপনি কী করেছেন দয়া করে তা ব্যাখ্যা করুন
ফ্যাবিও

1
@ ফ্যাবিও গেটপজিশন (ম্যাচ, পাঠ্য) 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
আপনি কেন ব্যাখ্যা করতে পারেন যে এটি কেন কাজ করে এবং অভ্যন্তরীণ লুপের প্রহরীতে কী চলছে? একটি ব্যাখ্যা কোনও নবাগত পাঠকের পক্ষে কার্যকর হতে পারে।
পল হিক্স

1
ইনডেক্সঅফ (স্ট্রিং স্ট্রিং, ইনডেক্স থেকে ইনডেক্স): নির্দিষ্ট সূচকের প্রথম স্ট্রেনিংয়ের এই স্ট্রিংয়ের মধ্যে সূচকটি নির্দিষ্ট সূচক থেকে শুরু করে দেয়। যদি এটি না ঘটে তবে -1 প্রদান করা হয়। এখানে কিছুক্ষণের অভ্যন্তরীণ লুপটি টোকেনের সমস্ত উত্স পেতে সক্ষম হবে (এখানে 'কী' হিসাবে পরিচিত ভেরিয়েবল দ্বারা নির্দিষ্ট করা হয়েছে)।
খান

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
আপনার
কোডটিতে

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
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
পিটার ব্রিটেন

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

আপনি যদি অনুসন্ধানের স্ট্রিংয়ের 'এন' ম্যাচের জন্য স্ক্যান করতে চলেছেন তবে আমি নিয়মিত এক্সপ্রেশন ব্যবহার করার পরামর্শ দেব । তাদের একটি খাড়া শেখার বক্ররেখা রয়েছে, তবে জটিল অনুসন্ধানগুলির ক্ষেত্রে তারা আপনাকে ঘন্টা বাঁচাতে পারে।


2
পরামর্শ: একটি নিয়মিত প্রকাশ থেকে অবস্থান পাওয়ার একটি উদাহরণ অন্তর্ভুক্ত করুন। কেবল "নিয়মিত এক্সপ্রেশন ব্যবহার করার চেষ্টা করুন" এটি একটি মূল মন্তব্য এবং এটি ওপির প্রশ্নের উত্তর দেয় না।
ব্র্যাড কোচ

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

আশা করি এটি সমস্যার সমাধান করবে তবে দয়া করে এটি দিয়ে আপনার কোডের ব্যাখ্যা যুক্ত করুন যাতে ব্যবহারকারী সঠিকভাবে বুঝতে পারে যা সে / সে সত্যই চায়।
জামিল প্যাটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.