Conoscere il numero e la posizione di tutte le occorrenze di una sottostringa in una stringa

Da Gambas-it.org - Wikipedia.

Mostriamo alcune modalità per conoscere la posizione di ogni eventuale occorrenza di una parola all'interno di una stringa.

Usando le sole risorse di Gambas

Public Sub Main()
 
 Dim s As String
 Dim i, ris As Integer

' Poniamo il caso che la stringa sia la seguente...
 s = "mela pera arancia banana pera arancia banana mela pera mela"
 
 Repeat
' ...e che la parola, di cui cercare le occorrenze, sia "pera":
   i = InStr(s, "pera", i)
   If i Then
     Inc i
     Inc ris
   Endif
 Until i == 0
  
 Print ris
 
End


Utilizzando un'apposita libreria dinamica condivisa .so esterna

Quest'altra modalità prevede la creazione e l'uso di un'apposita libreria dinamica condivisa .so esterna, scritta in C, che in sostanza provvederà a cercare il solo numero delle occorrenze della substringa all'interno della stringa:

Library "/tmp/lib_Occorrenze"

' int Occorrenze(const char *stringa, const char *substr)
' Ritorna il numero di occorrenze di una sottostringa all'interno di una stringa.
Private Extern Occorrenze(stringa As String, substr As String) As Integer


Public Sub Main()

 Dim s, su As String 
 Dim i As Integer

' Va a generare l'apposita libreria dinamica condivisa esterna:
 CreaSo()

' La stringa è la seguente:
 s = "mela pera arancia limone pera banana noce mela fico pera noce"
 
' La sottostringa di cui conoscere il numero di occorrenze:
 su = "pera"
 
 i = Occorrenze(s, su)
 
 Print "Numero occorrenze della sottostringa '"; su; "': "; i
 
End


Private Procedure CreaSo()
 
' Imposta il sorgente della libreria dinamica condivisa esterna:
 File.Save("/tmp/lib_Occorrenze.c", "#include <string.h>" &
           "\n\n" &
           "int Occorrenze(const char *stringa, const char *substr) {" &
           "\n\n" &
           "   int i = 0;" &
           "\n\n" &
           "   do {\n" &
           "      if (stringa = strstr (stringa, substr)) {;\n" &
           "         ++stringa;\n" &
           "         ++i;\n" &
           "      }" &
           "\n   } while (stringa);" &
           "\n\n   return i;\n\n}")
           
 
' Genera la libreria dinamica condivisa esterna:
 Shell "gcc -o /tmp/lib_Occorrenze.so /tmp/lib_Occorrenze.c -shared -fPIC" Wait
 
End