как найти количество вхождений подстроки в строке 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