-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 回答