2013-01-11 7 views
8

Mam ciąg znaków (na przykład: "Hello there. My name is John. I work very hard. Hello there!") i próbuję znaleźć liczbę wystąpień ciągu "hello there". Jak dotąd, jest to kod mam:jak znaleźć liczbę wystąpień podciągu w ciągu znaków vb.net

Dim input as String = "Hello there. My name is John. I work very hard. Hello there!" 
Dim phrase as String = "hello there" 
Dim Occurrences As Integer = 0 

If input.toLower.Contains(phrase) = True Then 
    Occurrences = input.Split(phrase).Length  
    'REM: Do stuff 
End If 

Niestety, co ta linia kodu wydaje się zrobić, to podzielić ciąg każdym razem widzi pierwszą literę phrase, w tym przypadku, h. Więc zamiast wyniku, na który mam nadzieję, otrzymam znacznie większą liczbę. Wiem, że liczenie liczby podziałów w łańcuchu jest okropnym sposobem na zrobienie tego, nawet jeśli otrzymałem poprawną odpowiedź, więc czy ktoś mógłby mi pomóc i udzielić pomocy?

+0

pytanie nie jest dobrze sformułowane. Jeśli używasz vb.net, ponieważ jest on oznaczony, funkcja Split zaakceptuje ciąg znaków, a nie tylko znak. Tak więc w twoim przypadku będzie to 3, ponieważ zapomniałeś odjąć 1. Reference: https://msdn.microsoft.com/en-us/library/system.string.split%28v=vs.110%29.aspx – Gaucho

Odpowiedz

2

można utworzyć pętlę do Until, która zatrzyma s gdy zmienna całkowita jest równa długości sprawdzanego ciągu znaków. Jeśli fraza istnieje, zwiększ liczbę wystąpień i dodaj długość frazy oraz pozycję, w której została znaleziona, do zmiennej kursora. Jeśli nie można znaleźć frazy, skończysz wyszukiwanie (brak wyników), ustaw ją na długość ciągu docelowego. Aby nie zliczyć tego samego zdarzenia więcej niż raz, zaznacz tylko kursor na długości docelowego ciągu w pętli (strCheckThisString).

Dim input As String = "hello there. this is a test. hello there hello there!" 
    Dim phrase As String = "hello there" 
    Dim Occurrences As Integer = 0 

    Dim intCursor As Integer = 0 
    Do Until intCursor >= input.Length 

     Dim strCheckThisString As String = Mid(LCase(input), intCursor + 1, (Len(input) - intCursor)) 

     Dim intPlaceOfPhrase As Integer = InStr(strCheckThisString, phrase) 
     If intPlaceOfPhrase > 0 Then 

      Occurrences += 1 
      intCursor += (intPlaceOfPhrase + Len(phrase) - 1) 

     Else 

      intCursor = input.Length 

     End If 

    Loop 
+0

To wygląda dobrze, ale czy możesz dodać trochę wyjaśnienia, co tu robisz? – Matt

+0

Dzięki. Edytowano z opisem. – N0Alias

+0

nie wiem, dlaczego jest to "najlepsza odpowiedź" - poniższa metoda Neolisk's string replace jest znacznie jaśniejsza ... wypróbuj! Drukuj Len ("Kot/Dogo/Królik") - Len (Zastąp ("Kot/pies/Królik", "/", "")) - 1 – jcansell

2

Trzeba tylko zmienić wejście funkcji dzielenia na tablicę ciągów znaków, a następnie oddzielić StringSplitOptions.

Wypróbuj ten wiersz kodu:

Occurrences = input.Split({phrase}, StringSplitOptions.None).Length 

Nie sprawdzałem tego, ale myślę będziesz też musiał uwzględnić fakt, że zjawiska byłyby zbyt wysokie ze względu na fakt, że jesteś podziału stosując kryteria wyszukiwania i rzeczywiście nie licząc ile razy w ciągu, więc myślęOccurrences = Occurrences - 1

Nadzieja to pomaga

10

Jeszcze inny pomysł:

Dim input As String = "Hello there. My name is John. I work very hard. Hello there!" 
Dim phrase As String = "Hello there" 
Dim Occurrences As Integer = (input.Length - input.Replace(phrase, String.Empty).Length)/phrase.Length 

Musisz tylko upewnić się, że phrase.Length > 0.

0

Nie wiem, czy to bardziej oczywiste? Począwszy od początku longString sprawdź następne znaki aż do liczby znaków w phrase, jeśli phrase nie zostanie znaleziony, zacznij szukać od drugiego znaku itp. Jeśli zostanie znaleziony, zacznij od aktualnej pozycji plus liczba znaków w phrase i zwiększamy wartość occurences

Module Module1 
Sub Main() 

    Dim longString As String = "Hello there. My name is John. I work very hard. Hello there! Hello therehello there" 

    Dim phrase As String = "hello There" 


    Dim occurences As Integer = 0 
    Dim n As Integer = 0 

    Do Until n >= longString.Length - (phrase.Length - 1) 
     If longString.ToLower.Substring(n, phrase.Length).Contains(phrase.ToLower) Then 
      occurences += 1 
      n = n + (phrase.Length - 1) 
     End If 
     n += 1 
    Loop 
    Console.WriteLine(occurences) 


End Sub 
End Module 
2

można utworzyć funkcję rekurencyjną korzystając indexOf. Przekazywanie szukanego łańcucha i szukanie ciągu znaków powoduje, że każda rekurencja zwiększa licznik i ustawia wskaźnik StartIndex na +1 do ostatnio znalezionego indeksu, dopóki nie zostanie znaleziony ciąg wyszukiwania.Funkcja wymaga parametrów opcjonalnych pozycji wyjściowej i przeciw przekazywane przez referencję:

Dim input As String = "Hello there. My name is John. I work very hard. Hello there!" 
Dim phrase As String = "hello there" 
Dim Occurrences As Integer 

Occurrances = InStrCount(input.ToLower, phrase.ToLower) 

Uwaga wykorzystaniem:

Function InStrCount(ByVal SourceString As String, _ 
        ByVal SearchString As String, _ 
        Optional ByRef StartPos As Integer = 0, _ 
        Optional ByRef Count As Integer = 0) As Integer 
    If SourceString.IndexOf(SearchString, StartPos) > -1 Then 
     Count += 1 
     InStrCount(SourceString, _ 
        SearchString, _ 
        SourceString.IndexOf(SearchString, StartPos) + 1, _ 
        Count) 
    End If 
    Return Count 
End Function 

wywołania funkcji przekazując ciąg wyszukiwania i ciąg do zlokalizowania i ewentualnie pozycji startowej. ToLower, który jest używany do ignorowania przypadku w porównaniu. Nie włączaj tej dyrektywy, jeśli chcesz, aby porównanie było zależne od przypadku.

12

najlepszym sposobem aby to zrobić jest to:

Public Function countString(ByVal inputString As String, ByVal stringToBeSearchedInsideTheInputString as String) As Integer 
    Return System.Text.RegularExpressions.Regex.Split(inputString, stringToBeSearchedInsideTheInputString).Length -1 

End Function 
+1

W jaki sposób obsługuje on nakładające się łańcuchy wyszukiwania? 'Dim inputString =" utwory ABBABBA popsongs "'i" Dim stringToBeSearchedInsideTheInputString = "ABBA" 'Jaka byłaby zwrócona wartość (1 lub 2)? – roland

+0

interesująca obserwacja. Czas trwania ABBA wynosi 1 w moim rozwiązaniu. Jeśli potrzebujesz obsługi takiego wyjątku, potrzebujesz innego podejścia, ale nigdy go nie potrzebowałem. Uwaga: nawet zaakceptowane rozwiązanie nie spełnia Twoich wymagań. – Gaucho

1

Patrząc na oryginalnej próbie, znalazłem, że powinno to załatwić sprawę jako „Split” tworzy tablicę. Zdarzenia = input.split (fraza) .ubound

To jest wielkość liter, więc w przypadku, gdy zwrot powinien być równy „Witam”, ponieważ nie ma „witam” na wejściu

0

użyłem to w VBScript, można przekonwertować to samo VB.net także

Dim str, strToFind 
str = "sdfsdf:sdsdgs::" 
strToFind = ":" 

MsgBox GetNoOfOccurranceOf(strToFind, str) 

Function GetNoOfOccurranceOf(ByVal subStringToFind As String, ByVal strReference As String) 
    Dim iTotalLength, newString, iTotalOccCount 
    iTotalLength = Len(strReference) 
    newString = Replace(strReference, subStringToFind, "") 
    iTotalOccCount = iTotalLength - Len(newString) 
    GetNoOfOccurranceOf = iTotalOccCount 
End Function 
0

znam ten wątek jest bardzo stary, ale mam też inne rozwiązanie:

Function countOccurencesOf(needle As String, s As String) 
    Dim count As Integer = 0 
    For i As Integer = 0 to s.Length - 1 
     If s.Substring(i).Startswith(needle) Then 
      count = count + 1 
     End If 
    Next 
    Return count 
End Function 
2
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum" 
b= LCase(str) 
array1=Split(b,"sum") 
l=Ubound(array1) 
msgbox l 

wyjście daje u nr. wystąpień ciągu znaków w innym.

1

jedno rozwiązanie oparte na InStr(i, str, substr) funkcji (wyszukiwanie substr w str począwszy od i położenie, more info about InStr()):

Function findOccurancesCount(baseString, subString) 
    occurancesCount = 0 
    i = 1 
    Do 
     foundPosition = InStr(i, baseString, subString) 'searching from i position 
     If foundPosition > 0 Then      'substring is found at foundPosition index 
      occurancesCount = occurancesCount + 1  'count this occurance 
      i = foundPosition + 1      'searching from i+1 on the next cycle 
     End If 
    Loop While foundPosition <> 0 
    findOccurancesCount = occurancesCount 
End Function 

Jak tylko zostanie znaleziony żaden podciąg (InStr powraca 0 zamiast znaleźć położenie podciąg łańcuch podstawowy), wyszukiwanie jest zakończone i zwracana jest liczba wystąpień.

Powiązane problemy