Contar ocurrencias

04/05/2006 - 21:59 por Pedro Echavarria | Informe spam
Soy nuevo en esto.

Hola, como puedo contar las ocurrencias de una palabra dentro de un string.


Gracias

Preguntas similare

Leer las respuestas

#6 Leonardo Azpurua [mvp vb]
05/05/2006 - 15:29 | Informe spam
"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
escribiendo y usando tu código:

Dim laFrase As String = "esto es un ejemplo especial"
Dim laPalabra As String = "es"
Dim numOcurrencias As Integer > laFrase.ToUpper.Split(laPalabra.ToUpper).Length - 1
MessageBox.Show(numOcurrencias)

Dim rex As New
System.Text.RegularExpressions.Regex(laPalabra.ToUpper)
Dim numPalabras As Integer = rex.Matches(laFrase.ToUpper).Count
MessageBox.Show(numPalabras)

En el primer ejemplo me sale 6 y en el segundo 3.



¿Habías notado (yo lo acabo de descubrir) que las conductas de
<String>.Split y la de Microsoft.VisualBasic.Split(<String>) son diferentes?

Este si "funciona" (es decir, devuelve lo mismo que la RegEx):

[Imports Microsoft.ViaulBasic]
Dim laFrase As String = "esto es un ejemplo especial"
Dim laPalabra As String = "es"
Dim numOcurrencias As Integer = UBound(Split(laFrase, laPalabra,
CompareMethod.Text))


Las expresiones reguladas es la forma más efectiva de hacer esto, porque
incluso puedes obligar a que en una cadena se tomen en cuenta o no, cuando
empieza por mayúscula, cuando tiene espacios, comas o puntos a los lados,
cuando forma palabra y no parte de una palabra como el caso que expones,
etc.

Espero que esto le aclare a Pedro las posibilidades de las Expresiones
Reguladas. :-)



Claro. Imagine palabras palabras, no palabritas :-))

Imagino que el patron para la expresion regular sería "(^|\W)+" & laPalabra
& "($|\W)+"

En realidad, nada se compara a las expresiones regulares para analizar
patrones de texto, y no es nada complicado. Es decir, las hay p*tas, pero la
relación utilidad/complejidad es tan alta que vale la pena meterse a fondo
con ellas.

Salud!
Respuesta Responder a este mensaje
#7 Raul
05/05/2006 - 22:30 | Informe spam
Solo por curiosidad, es que la mayoria de cosas de ese tipo son asi en .NET
?

Yo vengo de Visual Fox y hay una funcion que hace eso en una sola linea.



"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
Hola Leonardo,

escribiendo y usando tu código:

Dim laFrase As String = "esto es un ejemplo especial"
Dim laPalabra As String = "es"

Dim numOcurrencias As Integer > laFrase.ToUpper.Split(laPalabra.ToUpper).Length - 1
MessageBox.Show(numOcurrencias)

Dim rex As New
System.Text.RegularExpressions.Regex(laPalabra.ToUpper)
Dim numPalabras As Integer = rex.Matches(laFrase.ToUpper).Count
MessageBox.Show(numPalabras)

En el primer ejemplo me sale 6 y en el segundo 3.

Las expresiones reguladas es la forma más efectiva de hacer esto, porque
incluso puedes obligar a que en una cadena se tomen en cuenta o no, cuando
empieza por mayúscula, cuando tiene espacios, comas o puntos a los lados,
cuando forma palabra y no parte de una palabra como el caso que expones,
etc.

Espero que esto le aclare a Pedro las posibilidades de las Expresiones
Reguladas. :-)

Un saludo.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Blog de Jorge Serrano
http://geeks.ms/blogs/jorge/default.aspx


"Leonardo Azpurua [mvp vb]" wrote:


"Jorge Serrano [MVP VB]"

escribió
en el mensaje news:
> Hola,
>
> para contarel número de palabras de una cadena, sí es automático:
>
> Dim strFrase as String = "Frase de ejemplo"
> Dim numPalabras as Integer = 0
> numPalabras = strFrase.Split(Nothing).Length
>
> Para contar el número de ocurrencias de una palabra en una cadena, sí
> debes
> usar otros métodos más avanzados como las Expresiones Reguladas.
>
> Pero tampoco es tan complicado.

Hola, Jorge:

Una manera de hacerlo es:

numOcurrencias = laFrase.ToUpper.Split(laPalabra.ToUpper).Length - 1

si usaramos expresiones regulares tampoco sería complejo:

[Imports System.Text.RegularExpressions]
Dim rex As New Regex(laPalabra.ToUpper)
Dim numPalabras As Integer = rex.Matches(laFrase.ToUpper).Count

Salud!



Respuesta Responder a este mensaje
#8 Leonardo Azpurua [mvp vb]
05/05/2006 - 23:23 | Informe spam
"Raul" escribió en el mensaje
news:%
Solo por curiosidad, es que la mayoria de cosas de ese tipo son asi en
.NET ?

Yo vengo de Visual Fox y hay una funcion que hace eso en una sola linea.



Hola, Raul:

Cada vez que uno cambia de lenguaje echa de menos algunas características
del anterior.

Cuando pasé de "C" a VB5, extrañaba los apuntadores a funciones, las
estructuras tipo union, los campos de mascaras de bits, las funciones de
manejo dinámico de memoria y las de manejo de cadenas. Algunas cosas las
solucioné de otra manera, y otras simplemente aprendí a vivir sin ellas.

La "granularidad" de las funciones y propiedades de .NET es mucho mayor que
la de cualquiera de los lenguajes RAD anteriores de MS. Hay más funciones
más generales en .NET que en ninguna de las plataformas anteriores. Es tarea
de cada quien armar funciones de nivel superior que realicen las tareas que
uno espera. Normalmente, como en este caso, es cuestion de dos o tres lineas
de codigo (despues de una media hora hurgando en la documentacion).

Si hubieras dedicado el tiempo que dedicaste a escribir tu "queja
comparativa sobre VB NET y VFB" a implementar una funcion que cuente las
ocurrencias de una palabra en una cadena, y a colocarla en una clase de tu
libreria base, ya podrías hacerlo en una sola linea :-)

Por otra parte, cómo hacías en VFP para heredar de una clase base? Cómo
iniciabas un nuevo thread en VFP? Cuántos malabarismos tenías que hacer para
poder obtener una comunicacion confiable via TCP entre dos equipos? Podías
ejecutar tus aplicaciones en PDAs o en teléfonos móviles?

Las ventajas de usar .NET son muchas. Pero no deja de tener sus
inconvenientes. Uno de ellos es el precio que hay que pagar para recuperar
el código obsoleto, otro es una curva de aprendizaje rej*dida.

Salud!
Respuesta Responder a este mensaje
#9 Raul
06/05/2006 - 00:42 | Informe spam
Si hubieras dedicado el tiempo que dedicaste a escribir tu "queja
comparativa sobre VB NET y VFB" a implementar una funcion que cuente las
ocurrencias de una palabra en una cadena, y a colocarla en una clase de tu
libreria base, ya podrías hacerlo en una sola linea :-)




Cada quien es libre de quejarse no ? Y este es un foro libre no ?

Por otra parte, cómo hacías en VFP para heredar de una clase base?



VFP es orientado a objetos desde la version 3 de alrededor del año 1996.

Cómo iniciabas un nuevo thread en VFP?



No maneja threads. Las aplicaciones de gestion (a las que se orienta)
normalmente no los necesitan.

Cuántos malabarismos tenías que hacer para poder obtener una comunicacion
>confiable via TCP entre dos equipos?



Hace muchos años que VFP no tiene problemas de conexión de ningún tipo.

Podías ejecutar tus aplicaciones en PDAs o en teléfonos móviles?




No siempre fue así , es cierto pero, recientemente ya se pueden ejecutar en
PDA's al menos y las futuras versiones lo proyectan aún mejor.


Las ventajas de usar .NET son muchas.



Claro que sí. Por eso algunos foxeros andamos por aquí aprendiendo cosas
nuevas de esta excitante plataforma.


Pero no deja de tener sus inconvenientes.



Como con todo. No es malo quejarse, quizas en las proximas versiones se
sigue perfeccionando. O no ha ocurrido ya respecto a VS 2003 en cuanto al
manejo de datos ?


Uno de ellos es el precio que hay que pagar para recuperar el código
obsoleto,



"Obsoleto" es relativo. Para mi en el ejemplo que originó mi "queja" lo
obsoleto es tener que reprogramar funciones que ya parecían elementales.
Pero admito que quizas no era el mejor ejemplo. Debe haber otros.

otro es una curva de aprendizaje rej*dida.




Saludos
Respuesta Responder a este mensaje
#10 Leonardo Azpurua [mvp vb]
06/05/2006 - 08:16 | Informe spam
"Raul" escribió en el mensaje
news:
Si hubieras dedicado el tiempo que dedicaste a escribir tu "queja
comparativa sobre VB NET y VFB" a implementar una funcion que cuente las
ocurrencias de una palabra en una cadena, y a colocarla en una clase de
tu libreria base, ya podrías hacerlo en una sola linea :-)




Cada quien es libre de quejarse no ? Y este es un foro libre no ?



Es un foro libre, y cada quien es libre de quejarse. Pero indiscutiblemente
es una perdida de tiempo.

Por otra parte, cómo hacías en VFP para heredar de una clase base?



VFP es orientado a objetos desde la version 3 de alrededor del año 1996.



Eso he oido. Aunque nunca he conocida a nadie que aprovechara esas
capacidades, de modo que no sé si era Orientado a Objetos como Java u
Orientado a Objetos como VB6.

Cómo iniciabas un nuevo thread en VFP?



No maneja threads. Las aplicaciones de gestion (a las que se orienta)
normalmente no los necesitan.



No los necesitan porque no están disponibles. Pero no me digas que no es
bonito generar un reporte, por ejemplo, en un thread separado, y que el
usuario pueda seguir utilizando su aplicacion mientras tanto.

Cuántos malabarismos tenías que hacer para poder obtener una comunicacion
>confiable via TCP entre dos equipos?



Hace muchos años que VFP no tiene problemas de conexión de ningún tipo.



Pues que suerte. En VB6, las comunicaciones TCP (al menos si usabas el
mswinsck.ocx) eran un dolor de cabeza terrible.

Podías ejecutar tus aplicaciones en PDAs o en teléfonos móviles?




No siempre fue así , es cierto pero, recientemente ya se pueden ejecutar
en PDA's al menos y las futuras versiones lo proyectan aún mejor.



No tenia idea. Compilará codigo nativo, o piensan agregarle soporte para el
CLR.

Las ventajas de usar .NET son muchas.



Claro que sí. Por eso algunos foxeros andamos por aquí aprendiendo cosas
nuevas de esta excitante plataforma.


Pero no deja de tener sus inconvenientes.



Como con todo. No es malo quejarse, quizas en las proximas versiones se
sigue perfeccionando. O no ha ocurrido ya respecto a VS 2003 en cuanto
al manejo de datos ?



No se. En VB6 usaba consultas de accion para modificar los datos y
recordsets secuenciales para obtenerlos. Nunca he sabido hacer otra cosa.

Uno de ellos es el precio que hay que pagar para recuperar el código
obsoleto,



"Obsoleto" es relativo. Para mi en el ejemplo que originó mi "queja" lo
obsoleto es tener que reprogramar funciones que ya parecían elementales.
Pero admito que quizas no era el mejor ejemplo. Debe haber otros.



"Obsoleto" es el código que hay que mover de VB6, por ejemplo, a VB.NET.

Me gano la vida exclusivamente con un sistema hecho en VB6, que muy
lentamente voy rediseñando y desarrollando en VB.NET. El codigo de
producción de la aplicacion completa, es código "obsoleto" cuando lo copio y
lo pego en VB6. Supongo que estamos de acuerdo.

Imagino que cuando vienes de VFP, las cosas que te molestan son diferentes
de las que me molestan a mi, que vengo de VB6. Me parece que han complicado
demasiado algunas cosas (al mismo tiempo, otras las han mejorado
espectacularmente).

Salud!
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida