2012-03-19 19 views
9

, nasıl tek bir kelime için bir gönderim incelemek için bir normal ifade yazabilir "bir kelime içeriyor"?Yakut regex Ruby

O metni kabul ettiğini bir web formu var düşünün. Ben "katılmak" içerir --only-- cümle ben

if the_body == "join" 

kullanabilirsiniz görmek istiyorum biliyorum Ama bu sadece tüm metin gönderme ise "katıl" çalışır.

nasıl böyle bir gönderme yakalamak yapın:

"Ben kulübünüze katılmak ister misin?" ya

Teşekkür "Lütfen beni Katıl"!

+4

da '' yakalamak için "Ortak girişim" istiyor musunuz? –

cevap

24

Sen

string =~ /join/i 

veya

string.match(/join/i) 

ile performans yorumu ile ilgili küçük bir güncelleştirme yapabilir: Hız farkı burada gerçekten önemli değil iken

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

, regex sürümü aslında daha hızlıydı.

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

WORD var veya yok biz "katılmak" olmadığını bulmalıyız Lütfen dikkat: Bir dizede tam WORD bulmak için

+0

Düzgün bir dize aramasından daha yüksek bir yüke sahip olan bir regex yapmaya gerek yoktur. – thomthom

+1

Genel gider hakkında emin misiniz? "String # include?" Sonunda, O (mn) 'in en kötü performansına sahip olan bir Rabin-Karp algoritması kullanır, buna karşın uygun bir normal ifade motoru O (n)' de bunu yapabilir. –

+1

Eh, her zaman söylediğim şey bu. Doğrulamak için araştırılmamış olmama rağmen - mantıklı. Yani hayır. Emin değilim. ;) – thomthom

0

burada RegExp için gerek yok - String#include? iş yapacak.

+0

Herkese teşekkürler! – DougN

+0

Tam bir sözcük istiyor. – Ele

4

Doğru çözüm

the_body.match(/\bjoin\b/i) veya kullanan diğer regex olduğunu dize. Tüm solüsyon yukarıdaki gibi dizeleri için başarısız olur: they are joining canals veya My friend Bonjoiny is a cool guy