Использование регулярного выражения Чтобы найти общее появление & amp; T [duplicate]

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

Перехватчики захвата, $ 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

Полезно, если вы не хотите, чтобы совпадения сохранялись.

10
задан Charles 4 March 2013 в 00:45
поделиться

12 ответов

Вы можете создать цикл 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
3
ответ дан N0Alias 25 August 2018 в 19:37
поделиться

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

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
0
ответ дан Codename 25 August 2018 в 19:37
поделиться

Я использовал это в 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
0
ответ дан Dhanuka 25 August 2018 в 19:37
поделиться

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

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
13
ответ дан Gaucho 25 August 2018 в 19:37
поделиться

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

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()
1
ответ дан gibberish 25 August 2018 в 19:37
поделиться

Еще одно решение, основанное на функции 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, вместо найденной позиции подстроки в базовой строке), поиск завершается, и возвращается отсчет.

1
ответ дан Ivan Gerasimenko 25 August 2018 в 19:37
поделиться

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

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

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

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

Надеюсь, что это поможет

2
ответ дан John Bustos 25 August 2018 в 19:37
поделиться

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

2
ответ дан Jon Wilmer 25 August 2018 в 19:37
поделиться

Глядя на вашу первоначальную попытку, я обнаружил, что это должно сделать трюк, поскольку «Split» создает массив. Occurrences = input.split (фраза) .ubound

Это чувствительная к CaSe, поэтому в вашем случае фраза должна быть равна «Hello there», поскольку на входе

нет «привет там»,
1
ответ дан NeilR 25 August 2018 в 19:37
поделиться

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

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.

11
ответ дан Neolisk 25 August 2018 в 19:37
поделиться

Я не знаю, если это более очевидно? Начиная с начала 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
0
ответ дан SubtleStu 25 August 2018 в 19:37
поделиться
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum"
b= LCase(str)
array1=Split(b,"sum")
l=Ubound(array1)
msgbox l

выход дает u no. вхождения строки в другую.

4
ответ дан Sumit Kumar 25 August 2018 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: