2012-03-19 3 views
9

Ruby에서 한 단어를 제출하기 위해 정규식을 작성하려면 어떻게해야합니까?Ruby 정규식에 "단어가 포함되어 있습니다."

텍스트를 허용하는 웹 양식이 있다고 가정 해보십시오. 나는 "참여"를 포함 --only-- 문장은 내가

if the_body == "join" 

를 사용할 수 있는지 확인하려면 알 수 있지만, 단지 전체 텍스트 제출이 "가입"작동합니다.

어떻게 같이 제출을 잡을 않습니다

"나는 클럽에 가입하고 싶어?" 또는 "나와 함께하십시오"

고마워!

+4

"합작 투자"도 잡고 싶습니까? –

답변

24

당신은

string =~ /join/i 

또는

string.match(/join/i) 

과 성능 주석에 대한 약간의 갱신을 수행 할 수 있습니다 속도 차이는 정말 여기에 중요하지 않습니다 동안

>> 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 버전은 실제로 더 빠릅니다.

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

이 WORD의 존재 여부에 우리가 "가입"여부를 찾아야 참고 : 문자열에 정확한 단어를 찾을 수

+0

정규식을 수행 할 필요가 없다는 점을 제외하면 일반 문자열 검색보다 높은 오버 헤드가 있습니다. – thomthom

+1

오버 헤드가 확실합니까? 마지막에'String # include?'는 Rabin-Karp 알고리즘을 사용하는데,이 알고리즘은 최악의 경우 성능이 O (mn) 인 반면, 적절한 정규 표현식 엔진은 아마도 O (n)에서이를 수행 할 수 있습니다. –

+1

글쎄, 내가 항상 들었던 것이다. 나는 그것을 검증하기 위해 조사하지 않았지만 그럴듯하게 들렸다. 그래서 아니야. 나는 잘 모르겠다. ;) – thomthom

0

Regexp가 필요 없습니다. String#include?이 작업을 수행합니다.

+0

모두에게 감사드립니다! – DougN

+0

그/그녀는 정확한 단어를 원합니다. – Ele

4

올바른 해결책은

the_body.match(/\bjoin\b/i) 또는 사용하는 다른 정규식 문자열. 위의 모든 해결책은 다음과 같은 문자열에 대해서는 실패합니다 : they are joining canals 또는 My friend Bonjoiny is a cool guy

관련 문제