как найти количество вхождений подстроки в строке vb.net

У меня есть строка (например:"Hello there. My name is John. I work very hard. Hello there!") и я пытаюсь найти количество вхождений строки "hello there". До сих пор это код, который у меня есть:

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

к сожалению, эта строка кода, похоже, делит строку каждый раз, когда она видит первую букву phrase в этом случае h. Так что вместо результата Occurrences = 2 на что я бы надеялся, я на самом деле получаю гораздо большее число. Я знаю, что подсчет количества расколов в строке-это ужасный способ сделайте это, даже если я получу правильный ответ, Так может кто-нибудь помочь мне и оказать некоторую помощь?

12 ответов


вы можете создать цикл Do Until, который останавливается, как только целочисленная переменная равна длине строки, которую вы проверяете. Если фраза существует, увеличьте свои вхождения и добавьте длину фразы плюс позицию, в которой она находится, в переменную курсора. Если фраза не может быть найдена, вы закончили поиск (больше нет результатов), поэтому установите ее на длину целевой строки. Чтобы не считать одно и то же событие более одного раза, проверьте только от курсора до длины цели строка в цикле (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

лучший способ сделать это:

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

еще одна идея:

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

вам просто нужно убедиться, что phrase.Length > 0.


str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum"
b= LCase(str)
array1=Split(b,"sum")
l=Ubound(array1)
msgbox l

выход дает u нет. о появлении струны внутри другой.


вам просто нужно изменить вход функции split в массив строк, а затем delare StringSplitOptions.

попробуйте эту строку кода:

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

Я не проверял это, но я думаю, что вам также придется учитывать тот факт, что вхождения будут слишком высокими из-за того, что вы разделяете свою строку и не считаете, сколько раз она находится в строке, поэтому Я думаю Occurrences = Occurrences - 1

надеюсь, что это помогает


вы можете создать рекурсивную функцию с помощью IndexOf. Передавая строку для поиска и строку для поиска, каждая рекурсия увеличивает счетчик и устанавливает StartIndex в +1 последний найденный индекс, пока строка поиска больше не будет найдена. Функция потребует дополнительных параметров начальной позиции и счетчика, передаваемых по ссылке:

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

функция вызова путем передачи строки для поиска и строки для поиска и, необязательно, запуска позиция:

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)

обратите внимание на использование .ToLower, который используется для игнорирования случая в вашем сравнении. Не включайте эту директиву, если вы хотите, чтобы сравнение было конкретным случаем.


глядя на вашу оригинальную попытку, я обнаружил, что это должно сделать трюк, так как "Split" создает массив. Вхождения = ввод.сплит(фраза).метод ubound

это чувствительно к регистру, поэтому в вашем случае фраза должна быть равна "Hello there", так как нет" hello there " во входе


еще одно решение, основанное на


расширения простое решение Сумит Кумар (пожалуйста, upvote ответ а не этот), здесь он как однострочная рабочая функция:

Public Function fnStrCnt(ByVal str As String, ByVal substr As String) As Integer
    fnStrCnt = UBound(Split(LCase(str), substr))
End Function

демо:

Sub testit()
    Dim thePhrase
    thePhrase = "Once upon a midnight dreary while a man was in a house in the usa."
    If fnStrCnt(thePhrase, " a ") > 1 Then
        MsgBox "Found " & fnStrCnt(thePhrase, " a ") & " occurrences."
    End If
End Sub 'testit()

Я не знаю, является ли это более очевидным? Начиная с начала longString проверьте следующие символы до символов числа в phrase, Если phrase не найден начните искать со второго символа и т. д. Если он найден, запустите agin из текущей позиции плюс количество символов в phrase и увеличить значение 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

я использовал это в Vbscript, вы можете преобразовать то же самое в VB.net а также

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

Я знаю, что этот поток действительно старый, но у меня тоже есть другое решение:

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