https://foro.gambas-es.org/viewtopic.php?f=4&t=7681&p=46328#p46328
-----------------------------------
Grandamakulo
Viernes, 13 Septiembre 2019, 15:44

Re: RegExp Y Los «flags»
-----------------------------------
[quote user="shordi" post="46302"]
... y algo que decir 
 :mryellow:  :mryellow:  :mryellow:  :mryellow:[/quote]

Bueno, bueno, tampoco nos pongamos exquisitos. Ahí tienes el Marca o a Belén Esteban...

Insisto lo que en un comentario anterior decía respecto al componente RegExp: uso de PCRE, que limita el uso a ASCII extendido y no UTF-8, y la ausencia de la banderita [i]globalmatch[/i], «g».

En fin, aquí os dejo una función que funciona con PRCE... y sus limitaciones. Además pongo una comparativa de resultados con textos más o menos normalitos, dando por cierto que JS da valores exactos, dentro de lo posible, claro.
[code linenumbers=false syntax=gambas]
Public Function ContarPalabras(Texto As String) As Integer[]
  ' **** Estadísiticas de un texto.
  ' <<<< Devuelve una matriz de enteros:
  '       [0]: Número de palabras
  '       [1]: Número de tipos
  '       [2]: Número de caracteres
  '       [3]: Perspicuidad de Szgrizt 1993
  ' >>>> Texto plano para obtener estadísticas.
  '
  '' ╔═════════════════════════════════════════════════════════════╗
  '' ║ Atención: PCRE sólo admite texto ASCII extendido, no UTF-8. ║
  '' ║            Los valores obtenidos son aproximados.           ║
  '' ╚═════════════════════════════════════════════════════════════╝

  ' SCAM: Constante «campanita» = CHR(7)
  Dim iPaso As New Integer[4]     ' Variable de paso para almacenar resultados
  Dim sEse As String              ' Cadena de trabajo
  Dim iPal As Integer             ' Nº Palabras para cálculo perspicuidad
  Dim iSil As Integer             ' Nº Sílabas   "    "
  Dim iLet As Integer             ' Nº Letras    "    "
  Dim iFrs As Integer             ' Nº Frases    "    "
  Dim SCAM As String = Chr(7)
  
  ' Si no hay texto, no hay resultados
  If Not Texto Then Return [0, 0, 0, 0]
  
  ' Palabras
  sEse = RegExp.Replace(Texto, "([A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9])[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]*", SCAM, RegExp.Greedy)
  iPal = Split(sEse, SCAM).Max
  iPaso[0] = iPal
  
  ' Tipos
  sEse = RegExp.Replace(Texto, ".", SCAM, RegExp.Greedy)
  iPaso[1] = Split(sEse, SCAM).Max
  
  ' Caracteres
  sEse = RegExp.Replace(Texto, "\\S", SCAM, RegExp.Greedy)
  iPaso[2] = Split(sEse, SCAM).Max
  
  ' Sílabas
  sEse = RegExp.Replace(Texto, "[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]", SCAM, RegExp.Greedy + RegExp.Caseless)
  iSil = Split(sEse, SCAM).Max
  
  ' Letras
  sEse = RegExp.Replace(Texto, "[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]", SCAM, RegExp.Greedy)
  iLet = Split(sEse, SCAM).Max
  
  ' Frases
  sEse = RegExp.Replace(Texto, "[.?!][^.?!]", SCAM, RegExp.Greedy)
  iFrs = Split(sEse, SCAM).Max
  
  ' Perspicuidad
  If iPal > 0 And iFrs > 0 Then
      iPaso[3] = 206.835 - 62.3 * iSil / iPal - iPal / iFrs
    Else
      iPaso[3] = 0
  Endif
  
  Return iPaso

End[/code]

[font=Courier New]╔══════════════╦════════════╦══════════╦═══════════════╦═══════════════════╗
║              ║  Patrón 1  ║ Patrón 2 ║    Patrón 3   ║      Patrón 4     ║
╠══════════════╬══════╦═════╬═════╦════╬═══════╦═══════╬═════════╦═════════╣
║              ║ PCRE ║  JS ║ PCR ║ JS ║  PCR  ║   JS  ║   PCR   ║    JS   ║
╠══════════════╬══════╬═════╬═════╬════╬═══════╬═══════╬═════════╬═════════╣
║ Palabras     ║   52 ║  52 ║  51 ║ 50 ║ 1.882 ║ 1.882 ║ 381.235 ║ 381.231 ║
╠══════════════╬══════╬═════╬═════╬════╬═══════╬═══════╬═════════╬═════════╣
║ Sílabas      ║  115 ║ 111 ║ 110 ║ 96 ║ 3.814 ║ 3.568 ║ 747.811 ║ 705.946 ║
╠══════════════╬══════╬═════╬═════╬════╬═══════╬═══════╬═════════╬═════════╣
║ Frases       ║    8 ║   8 ║   9 ║  9 ║    30 ║    30 ║   9.720 ║   9.720 ║
╠══════════════╬══════╬═════╬═════╬════╬═══════╬═══════╬═════════╬═════════╣
║ Perspicuidad ║   63 ║  67 ║  67 ║ 82 ║    18 ║    26 ║      45 ║      52 ║
╚══════════════╩══════╩═════╩═════╩════╩═══════╩═══════╩═════════╩═════════╝[/font]

PS.—Para comparaciones y ara aprender ausar RegExp he empleado:
https://regexr.com/
Totalmente recomendable.


