Я думаю, что дам вам ответ. Не используйте переменные захвата, не проверяя, что совпадение выполнено успешно.
Перехватчики захвата, $ 1 и т. д. недействительны, если совпадение не выполнено, и они 'также не очищается.
#!/usr/bin/perl
use warnings;
use strict;
$_ = "bronto saurus burger";
if (/(?:bronto)? saurus (steak|burger)/)
{
print "Fred wants a $1";
}
else
{
print "Fred dont wants a $1 $2";
}
В приведенном выше примере, Чтобы избежать захвата bronto в $ 1, используется (? :). Если шаблон сопоставляется, то $ 1 фиксируется как следующий сгруппированный шаблон. Таким образом, выход будет выглядеть следующим образом:
Fred wants a burger
Полезно, если вы не хотите, чтобы совпадения сохранялись.
Вы можете создать цикл Do Until, который останавливается, когда целочисленная переменная равна длине строки, которую вы проверяете. Если фраза существует, увеличьте свои вхождения и добавьте длину фразы плюс позицию, в которой она находится, с переменной курсора. Если фраза не найдена, вы выполнили поиск (больше результатов), поэтому установите ее в длину целевой строки. Чтобы не засчитывать одно и то же событие более одного раза, проверьте только курсор на длину целевой строки в Loop (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
Я знаю, что эта ветка действительно старая, но у меня есть и другое решение:
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
Я использовал это в 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
лучший способ сделать это:
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
Расширяясь на простое решение Сумита Кумара (пожалуйста, воздержитесь его ответ , а не этот), здесь он является однострочной рабочей функцией:
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()
Еще одно решение, основанное на функции InStr(i, str, substr)
(поиск substr
в str
, начиная с позиции i
, больше информации о 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
Как только нет подстроки, найденной (InStr
возвращает 0
, вместо найденной позиции подстроки в базовой строке), поиск завершается, и возвращается отсчет.
Вам просто нужно изменить вход функции 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» создает массив. Occurrences = input.split (фраза) .ubound
Это чувствительная к CaSe, поэтому в вашем случае фраза должна быть равна «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 = (input.Length - input.Replace(phrase, String.Empty).Length) / phrase.Length
Вам просто нужно убедиться, что phrase.Length > 0
.
Я не знаю, если это более очевидно? Начиная с начала longString
проверьте следующие символы до числовых символов в phrase
, если phrase
не найден, начните смотреть со второго символа и т. Д. Если он найден, начните с текущей позиции плюс число символов в 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
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum"
b= LCase(str)
array1=Split(b,"sum")
l=Ubound(array1)
msgbox l
выход дает u no. вхождения строки в другую.