2012-03-19 26 views
9

In Ruby, come posso scrivere una regex per ispezionare una submission per una singola parola?Ruby regex "contiene una parola"

Immagina di avere un modulo Web che accetta testo. So che se voglio vedere se la frase contiene --only-- "join" posso usare

if the_body == "join" 

ma che funziona solo se l'intera presentazione del testo è "join".

Come faccio a prendere un invio come questo:

"Voglio entrare nel club?" o "Unisciti a me per favore"

Grazie!

+4

Vuoi anche prendere "Joint venture"? –

risposta

24

È possibile farlo con

string =~ /join/i 

o

string.match(/join/i) 

un piccolo aggiornamento per quanto riguarda il commento prestazioni:

>> 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) 

Mentre la differenza di velocità non importa qui, la versione regex era in realtà più veloce.

+0

Tranne che non è necessario eseguire un'espressione regolare, che presenta un sovraccarico superiore rispetto a una ricerca con stringa semplice. – thomthom

+1

Sei sicuro del sovraccarico? 'String # include?' Alla fine usa un algoritmo Rabin-Karp, che ha una performance peggiore di O (mn), mentre un motore regex appropriato può probabilmente farlo in O (n). –

+1

Beh, è ​​quello che mi è sempre stato detto. Anche se non ho indagato per verificarlo - sembrava plausibile. Quindi, no. Non ne sono sicuro. ;) – thomthom

0

Non c'è bisogno di Regexp qui - String#include? farà il lavoro.

+0

Grazie a tutti! – DougN

+0

Lui/lei vuole una parola esatta. – Ele

4

soluzione corretta per trovare una parola esatta in una stringa è

the_body.match(/\bjoin\b/i) o utilizzare altre espressioni regolari:

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

Si prega di notare, abbiamo bisogno di trovare se "join" esiste o non a parole la stringa. Tutto sopra la soluzione fallirà per stringhe come: they are joining canals o My friend Bonjoiny is a cool guy

Problemi correlati