2013-01-11 13 views
8

Ho una stringa (ad esempio: "Hello there. My name is John. I work very hard. Hello there!") e sto cercando di trovare il numero di occorrenze della stringa "hello there". Finora, questo è il codice che ho:come trovare il numero di occorrenze di una sottostringa all'interno di una stringa vb.net

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 

Purtroppo, ciò che questa riga di codice sembra fare è dividere la stringa ogni volta che vede la prima lettera del phrase, in questo caso, h. Quindi, invece del risultato Occurrences = 2 che spero, otterrò un numero molto più grande. So che contare il numero di spaccature in una stringa è un modo orribile per fare questo, anche se ottengo la risposta corretta, quindi qualcuno potrebbe aiutarmi e fornire assistenza?

+0

la domanda non è ben formata. Se stai usando vb.net mentre è taggato, la funzione Split accetterà una stringa, non solo un carattere. Quindi l'occorrenza nel tuo caso sarà 3 perché hai dimenticato di sottrarre 1. Riferimento: https://msdn.microsoft.com/en-us/library/system.string.split%28v=vs.110%29.aspx – Gaucho

risposta

2

è possibile creare un ciclo Do Until che si fermano s una volta una variabile intera è uguale alla lunghezza della stringa che stai controllando. Se la frase esiste, incrementa le tue occorrenze e aggiungi la lunghezza della frase più la posizione in cui si trova alla variabile del cursore. Se la frase non può essere trovata, la ricerca è terminata (non ci sono più risultati), quindi impostarla sulla lunghezza della stringa di destinazione. Per non contare la stessa occorrenza più di una volta, selezionare solo dal cursore alla lunghezza della stringa di destinazione nel 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 
+0

Questo sembra buono, ma puoi aggiungere una piccola spiegazione su cosa stai facendo qui? – Matt

+0

Grazie. Modificato con una descrizione. – N0Alias

+0

non si sa perché questa sia la "miglior risposta" - il metodo di sostituzione delle stringhe di Neolisk di seguito è molto più chiaro ... provatelo! Stampa Len ("Gatto/Dogo/Coniglio") - Len (Sostituisci ("Gatto/cane/Coniglio", "/", "")) - 1 – jcansell

2

È sufficiente modificare l'input della funzione di divisione in una stringa di array e quindi delare lo StringSplitOptions.

Prova questa riga di codice:

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

non ho controllato questo, ma sto pensando avrete anche per tenere conto del fatto che gli eventi sarebbero troppo alta a causa del fatto che si sta dividendo utilizzando la stringa e non effettivamente contare quante volte è nella stringa, quindi pensoOccurrences = Occurrences - 1

Spero che questo aiuti

10

Ancora un'altra idea:

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 

Hai solo bisogno di fare in modo che phrase.Length > 0.

0

Non so se questo è più ovvio? A partire dall'inizio di longString controllare i caratteri successivi fino al numero di caratteri in phrase, se phrase non viene trovato iniziare a cercare dal secondo carattere ecc. Se viene trovato iniziare dalla posizione corrente più il numero di caratteri in phrase e incrementare il valore di 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 
2

Si potrebbe creare una funzione ricorsiva utilizzando IndexOf. Passando la stringa da cercare e la stringa da individuare, ciascuna ricorsione incrementa un contatore e imposta StartIndex su +1 rispetto all'ultimo indice trovato, fino a quando la stringa di ricerca non viene più trovata.Funzione richiederà parametri opzionali posizione di partenza e Counter passati per riferimento:

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) 

Nota l'uso di:

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 

funzione di chiamata passando stringa da cercare e la stringa per individuare e, opzionalmente, posizione di partenza. ToLower, che è usato per ignorare case nel confronto. Non includere questa direttiva se si desidera che il confronto sia specifico del caso.

12

il modo migliore per farlo è questo:

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 
+1

In che modo gestisce le stringhe di ricerca che si sovrappongono? 'Dim inputString =" songs ABBABBA popsongs "'e' Dim stringToBeSearchedInsideTheInputString =" ABBA "' Quale sarebbe il valore restituito (1 o 2)? – roland

+0

osservazione interessante. L'occorrenza di ABBA è 1 con la mia soluzione. Se è necessario gestire tale eccezione, è necessario un approccio diverso, ma non ne ho mai avuto bisogno. Nota: anche la soluzione accettata non si adatta alle tue esigenze. – Gaucho

1

Guardando il tuo tentativo originale, ho trovato che questo dovrebbe fare il trucco come "Split" crea un array. Occurrences = input.split (frase) .ubound

Questo è case sensitive, quindi nel tuo caso la frase dovrebbe Equal "Ciao a tutti", in quanto non v'è alcuna "ciao là" nell'input

0

ho usato questo in VBScript, è possibile convertire lo stesso a VB.net così

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

so che questa discussione è molto vecchio, ma ho avuto un'altra soluzione troppo:

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 
2
str="Thisissumlivinginsumgjhvgsum in the sum bcoz sum ot ih sum" 
b= LCase(str) 
array1=Split(b,"sum") 
l=Ubound(array1) 
msgbox l 

l'uscita fornisce il n. di occorrenze di una stringa all'interno di un'altra.

1

Un'altra soluzione basata su InStr(i, str, substr) funzione (ricerca substr in str a partire dalla i posizione, more info about 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 

Non appena v'è alcuna sottostringa trovata (InStr rendimenti 0, invece di posizione sottostringa trovata in stringa di base), la ricerca è finita e il conteggio delle occorrenze viene restituito.

Problemi correlati