-1

正規表現を介して日付を一致させています。一部の人にとってはかなりうまく機能していますが、他の人にとっては単に機能していませんが、その理由はわかりません.

ドイツ語のRubyでこれを行っています:

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

ランダムに選択したhttp://de.wikipedia.org/wiki/Inkunabelのテキストでテストしました。戻り値:

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

そして、一致は正しいですが"31. Dezember 1500"、私の目的では一致する必要がありますが、そうではありません。なぜ一致しないの"31. Dezember 1500"ですか?

4

1 に答える 1

2

月は括弧 [] ではなく、括弧 () で囲む必要があると思います。

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

31. Dezember 1500他の日付でも機能する場合は、HTML ソースのように日付が記述されているためと思われます。

アップデート:

各試合で月を返さないようにするには、非キャプチャ グループを使用します。(?: )

しかし、元の正規表現が機能したとしても、外側の括弧のセットのために、各結果をサブ配列で返す必要があります。

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を使っているので問題ありません。

于 2012-12-04T12:50:34.947 に答える