2012-05-12 3 views
0

텍스트 파일에서 단어 목록을 가져온 다음 일련의 문자를 제공 한 다음 모든 문자를 포함하는 단어를 일치시키는 코드를 작성하고 싶습니다. 그래서 "lheol"이라는 글자를 입력하면 "hello"와 일치합니다.특정 문자가 포함 된 단어를 일치시키는 정규 표현식

내가 떨어져 생각 정규식은 뭔가 같은 :

나는 그냥 "안녕하세요"라는 단어를 일치시킬 때 "Hellod"를 말할 일치합니다 그러나
string =~ /(?=.*l{2})(?=.*h{1})(?=.*o{1})(?=.*e{1}).*/i 

.

아이디어가 있으십니까?

+0

'/ \ b *? b * i? – neevek

답변

3

정규 표현식으로이 문제를 해결하는 것은 한 단어에 많은 문자 조합이있을 수 있기 때문에 적합하지 않습니다. 대신 검색 단어와 각 대상의 문자를 정렬하고 문자열 평등을 검사하는 것이 좋습니다.

class String 
    def sort 
    self.chars.sort.join.downcase 
    end 
end 
'hello'.sort # => 'ehllo' 
'leloh'.sort # => 'ehllo' 
'Hellod'.sort # => 'dehllo' 
1

정규식은 실제로 필요하지 않습니다. 한 단어에 각 문자의 인스턴스가 하나 이상 포함되어 있는지 알아 보려면 문자 포함 여부를 확인할 수 있습니다.

def word_match(word, letters) 
    letters.split(//).uniq.each { |char| return false unless word.include? char } 
    true 
end 

이렇게하면 좋은 점은 편지를 찾을 수없는 경우 빨리 실패한다는 것입니다.

1

그냥이 (또한 필요한 경우 모든 가능한 조합을 시도의 부담이, 정규식 엔진에 놓여 있음을 의미) 정규식을 사용하여 수행 할 수있는 방법을 보여 :

if subject =~ /^(?:h()|e()|l()|l()|o()){5}\1\2\3\4\5$/ 
    # Successful match 
else 
    # Match attempt failed 
end 

트릭 각 문자 다음에는 항상 일치하는 빈 캡처 그룹 ()이옵니다. 그런 다음 정규 표현식이 끝날 때 역 참조 \1\2\3\4\5은 모든 문자가 정확히 한 번만 일치했는지 확인합니다 (이전 반복이 정확히 5 회 반복 할 수 있고 5 개의 캡처 그룹이 모두 확인되기 때문에)

+0

Nice. (* = * * {1}) (? = * * {1}) 이상하지만 좋은. – pguardiario

+0

@ pguardiario : 예, 집에서 이것을 시도하지 마십시오. –

관련 문제