2012-12-04 3 views
-1

정규식을 통해 날짜가 일치합니다. 그것은 꽤 잘 작동하지만 다른 사람들은 단순히 작동하지 않지만 나는 왜 그런지 이해하지 못합니다. 일부 날짜에 Regex가 작동하지 않습니다.

나는 독일어 루비에서이 일을 해요 : 나는 무작위로 선택된 http://de.wikipedia.org/wiki/Inkunabel :

def extract_dates 
    months = ["Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] 
    days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"] 
    self.content.scan(/([0-9]{1,2}\.\s?[#{months.join("|")}]\s?[0-9]{4})/) 
end 

내가의 텍스트를 테스트했다.

=> ["18. Juli 1471", "11. Februar 1486", "14. August 1473", "1. Januar 1501", "8. Januar 2008", "23. Mai 2006"] 

을 그리고 경기는 정확하지만 내 목적이 일치하는 것이 아니라해야 들면, "31. Dezember 1500"을 잎 : 그것은 반환합니다. 일치하지 않는 이유는 무엇입니까 "31. Dezember 1500"?

+0

위키 피 디아를 긁어 모으려면 [API] (http://www.mediawiki.org/wiki/API)를 사용하거나 금지 될 위험이 있습니다. 구르는 친근한 방법입니다. –

답변

2

나는 당신이 괄호 []가 아닌 달 주위에 괄호()가 있어야한다고 생각합니다. 그것은 다른 날짜에 대해 작동하는 경우 날짜가 HTML 소스에 31. Dezember 1500로 작성되기 때문에

/([0-9]{1,2}\.\s?(#{months.join("|")})\s?[0-9]{4})/ 

아마입니다. 전혀 일 경우 각 경기 월을 반환 방지하기 위해

, 그냥, 비 캡처 그룹 (?:)

그러나 원래 정규식을 사용하여 각 결과를 반환해야 : 업데이트

하위 배열에서 바깥 쪽 괄호 집합 때문에.

content = "31. Dezember 1500 and 8. Januar 2008" 
months = ["Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] 

# Your original expression 
content.scan /([0-9]{1,2}\.\s?[#{months.join("|")}]\s?[0-9]{4})/ 
# => [] 

# With a non-capturing group instead of [] 
content.scan /([0-9]{1,2}\.\s?(?:#{months.join("|")})\s?[0-9]{4})/ 
# => [["31. Dezember 1500"], ["8. Januar 2008"]] 

# Without the outer parentheses 
content.scan /[0-9]{1,2}\.\s?(?:#{months.join("|")})\s?[0-9]{4}/ 
# => ["31. Dezember 1500", "8. Januar 2008"] 

나는 또한 1.9.3에 해당하므로 문제되지 않습니다.

+0

[]을 (를) Swithcing하면 결과가 반환되는 방식으로 결과가 변경되지 않았습니다. 이제 각각의 결과는 자체 배열로 반환됩니다 ^^ 또한 mechanize와 nokogiri를 사용하여 엉뚱한 html 문제를 자동으로 처리하는 페이지에서 텍스트를 추출합니다. 그러나 어쨌든 당신을 감사하십시오! – davidb

+1

이상한. 대괄호는 irb에서 나를 위해 작동하지 않으며, 나는 그들이해야한다고 생각하지 않는다; 그룹화 된 표현식이 아니라 문자 클래스를 정의합니다. –

+0

나는 ruby ​​1.9.3을 사용해 보았을 것이다. 아마도 차이점은 – davidb

관련 문제