2012-12-19 15 views
8

Powiel możliwe:
Occurences of substring in a stringIle razy jeden ciąg zawiera inną

Jak w temacie jak sprawdzić ile razy jeden ciąg zawiera jeszcze jeden? Przykład:

s1 "babab" 
s2 "bab" 
Result : 2 

Jeśli użyję dopasowujący to rozpoznaje tylko pierwsze wystąpienie:

String s1 = JOptionPane.showInputDialog(" "); 
String s2 = JOptionPane.showInputDialog(" "); 
Pattern p = Pattern.compile(s2); 
Matcher m = p.matcher(s1); 
int counter = 0; 
while(m.find()){ 
    System.out.println(m.group()); 
    counter++; 
} 
System.out.println(counter); 

mogę zrobić to tak, ale chciałbym poniżej użyć biblioteki Java Iike Scanner, StringTokenizer, dopasowujący etc:

String s1 = JOptionPane.showInputDialog(" "); 
String s2 = JOptionPane.showInputDialog(" "); 
String pom; 
int count = 0; 
for(int i = 0 ; i< s1.length() ; i++){ 
    if(s1.charAt(i) == s2.charAt(0)){ 
     if(i + s2.length() <= s1.length()){ 
      pom = s1.substring(i,i+s2.length()); 
      if(pom.equals(s2)){ 
       count++; 
      } 
     } 
    } 
} 

System.out.println(count); 
+0

Czy to jest zadanie domowe? –

+3

Możesz po prostu użyć 'String # indexOf()' w pętli while, zaczynając od ostatnio znalezionego indeksu. – assylias

+1

http://stackoverflow.com/questions/767759/occurences-of-substring-in-a-string –

Odpowiedz

0

Niektóre szybkie rozwiązanie Bruce Forte:

String someString = "bababab"; 
    String toLookFor = "bab"; 
    int count = 0; 
    for (int i = 0; i < someString.length(); i++) { 
     if (someString.length() - i >= toLookFor.length()) { 
      if (someString.substring(i, i + toLookFor.length()).equals(toLookFor) && !"".equals(toLookFor)) { 
       count++; 
      } 
     } 
    } 
    System.out.println(count); 

ten wypisuje 3. Uwaga Zakładam, że żaden z String s ma wartość null.

1

Klasa Matcher ma dwie metody "start" i "end", które zwracają indeks początkowy i końcowy ostatniego dopasowania. Ponadto, metoda find ma opcjonalny parametr "start", w którym rozpoczyna wyszukiwanie.

2

Myślę, że to może zadziałać, jeśli znasz słowo, którego szukasz w łańcuchu, co może być konieczne, aby edytować wzór regex.

String string = "hellohellohellohellohellohello"; 
Pattern pattern = Pattern.compile("hello"); 
Matcher matcher = pattern.matcher(string); 
int count = 0; 
while (matcher.find()) count++; 
+0

Dla ciągu 'babab' z wzorem' bab' daje liczyć jako '1'. – mtk

+0

czy możesz uruchomić go dla "bababab" i zobaczyć wynik?jeśli jest dwa, to wzorce odrzucają część struny, która już ją znalazła. Myślę, że to, co robi, to "bab-ab" jest jeden, więc to może nie być najlepsze dla ciebie .. – Drakoumel

+0

może to by działało lepiej (nie testowałem tego i napisałem to w notatniku, więc bądź ostrożny: D) Tekst ciągu = "babab"; String matchWord = "bab"; String newWord = ""; char [] chars = text.split (""); int counter; dla (int j = 0; j Drakoumel

0

można zrobić to tak

private int counterString(String s,String search) { 
    int times = 0; 
    int index = s.indexOf(search,0); 
    while(index > 0) { 
     index = s.indexOf(search,index+1); 
     ++times; 
    } 
    return times; 
} 
4

jedno rozwiązanie liniowej dla lulz

longStr jest ciąg wejściowy. findStr to ciąg do wyszukania. Żadne założenie, z tym wyjątkiem, że musi mieć co najmniej 1 znak, musi być i .

longStr.length() - longStr.replaceAll(Pattern.quote(findStr.substring(0,1)) + "(?=" + Pattern.quote(findStr.substring(1)) + ")", "").length() 

Od 2 mecze są uważane inny dopóki rozpoczyna się w różnym indeksie, a nakładające się może zdarzyć, musimy znaleźć sposób, aby odróżnić meczów i pozwalają na dopasowane do części pokrywały.

Sztuką jest spożyć tylko pierwszy znak ciągu wyszukiwania i użyć wyprzedzającego, aby potwierdzić pozostałą część szukanego ciągu. Pozwala to na powiązanie części pokrywającej się, a usuwając pierwszą postać meczu, możemy policzyć liczbę dopasowań.

+0

Jak to działa? Nie rozumiem metody Pattern.quote, co to jest dosłowne wyrażenie regularne? – MOnasz

+0

@ user1915933: Oznacza to, że nawet jeśli ciąg zawiera znaki lub sekwencje, które można rozpoznać jako regex, zostaną one zneutralizowane do postaci normalnych. – nhahtdh

Powiązane problemy