2012-03-19 15 views
9

En Ruby, ¿cómo puedo escribir una expresión regular para inspeccionar una presentación por una sola palabra?Ruby regex "contiene una palabra"

Imagine que tengo un formulario web que acepta texto. Sé que si quiero ver si la frase contiene --only-- "unen" Puedo usar

if the_body == "join" 

Pero eso sólo funciona si toda la presentación del texto es "unir".

¿Cómo atrapar una presentación como esta:

"Quiero unirme a su club?" o "Únete a mí por favor"

¡Gracias!

+4

¿Desea también capturar '" Joint venture "'? –

Respuesta

24

Puede hacerlo con

string =~ /join/i 

o

string.match(/join/i) 

Una pequeña actualización con respecto al comentario de rendimiento:

>> s = "i want to join your club" 
>> n = 500000 
=> 500000 
>> Benchmark.bm do |x| 
..  x.report { n.times { s.include? "join" } } 
.. x.report { n.times { s =~ /join/ } } 
.. end 
     user  system  total  real 
    0.190000 0.000000 0.190000 ( 0.186184) 
    0.130000 0.000000 0.130000 ( 0.135985) 

Mientras que la diferencia de velocidad no importa realmente aquí, la versión de expresiones regulares era realmente más rápida.

+0

Excepto que no hay necesidad de hacer una expresión regular, que tiene una sobrecarga más alta que una búsqueda simple de cadenas. – thomthom

+1

¿Estás seguro de los gastos generales? 'String # include?' Al final usa un algoritmo Rabin-Karp, que tiene el peor rendimiento de O (mn), mientras que un motor de expresiones regulares adecuado probablemente puede hacer esto en O (n). –

+1

Bueno, es lo que siempre me han dicho. Aunque no he investigado para verificarlo, sonaba plausible. Entonces, no. No estoy seguro. ;) – thomthom

0

No hay necesidad de Regexp aquí - String#include? hará el trabajo.

+0

¡Gracias a todos! – DougN

+0

Él/ella quiere una palabra exacta. – Ele

4

solución correcta para encontrar una palabra exacta de una cadena es

the_body.match(/\bjoin\b/i) o uso de expresiones regulares:

(\W|^)join(\W|$)

Tenga en cuenta, tenemos que encontrar si "unir" existe WORD o no en la cuerda. Todas las soluciones anteriores fallarán para cadenas como: they are joining canals o My friend Bonjoiny is a cool guy

Cuestiones relacionadas