12

文字列(例"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実際にははるかに多くの数が得られます。文字列の分割数を数えることは、たとえ正しい答えが得られたとしても、これを行うには恐ろしい方法であることを知っています。誰かが私を助けて助けてくれませんか?

4

12 に答える 12

21

さらに別のアイデア:

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ます。

于 2013-01-11T22:59:10.440 に答える
5
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum"
b= LCase(str)
array1=Split(b,"sum")
l=Ubound(array1)
msgbox l

出力はあなたにノーを与えます。別の文字列内の文字列の出現。

于 2015-10-18T11:08:37.433 に答える
4

整数変数がチェックしている文字列の長さと等しくなると停止する Do Until ループを作成できます。フレーズが存在する場合は、出現回数を増やし、フレーズの長さとフレーズが見つかった位置をカーソル変数に追加します。フレーズが見つからない場合は、検索は終了です (これ以上の結果はありません) ので、目的の文字列の長さに設定します。同じ出現回数を 2 回以上カウントしないようにするには、ループ (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
于 2013-01-11T21:54:33.197 に答える
3

分割関数の入力を文字列配列に変更してから、を削除する必要がありStringSplitOptionsます。

次のコード行を試してください。

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

私はこれをチェックしていませんが、文字列を使用して分割し、実際に文字列が何回あるかをカウントしていないため、発生率が高すぎるという事実も考慮する必要があると思います文字なので、 Occurrences = Occurrences - 1

お役に立てれば

于 2013-01-11T21:14:55.903 に答える
2

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 の使用に注意してください。比較をケース固有にしたい場合は、このディレクティブを含めないでください。

于 2014-02-20T11:27:06.410 に答える
2

InStr(i, str, substr)関数に基づくもう 1 つの解決策(位置から開始して検索substrInStr() に関する詳細情報):stri

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、検索は終了し、出現回数が返されます。

于 2016-08-24T09:00:43.943 に答える
0

私はこれを 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
于 2015-07-18T12:22:16.210 に答える
0

これがより明白かどうかわかりませんか?の先頭からlongString次の文字を の number 文字までチェックし、が見つからないphrase場合は 2 番目の文字から検索を開始しますphrase。見つかった場合は、現在の位置に の文字数を加えた位置から開始してphraseoccurences

 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
于 2013-01-11T23:26:54.310 に答える