我通过正则表达式匹配日期。它对一些人来说效果很好但是对于其他人来说它根本不起作用,但我不明白为什么。
我在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"
不匹配?
答案 0 :(得分:2)
我认为你应该在几个月内使用圆括号(),而不是括号[]。
/([0-9]{1,2}\.\s?(#{months.join("|")})\s?[0-9]{4})/
如果它适用于其他日期,可能是因为日期在html源代码中被写为31. Dezember 1500
。
<强>更新强>
为避免在每场比赛中返回月份,只需使用非捕获组(?: )
但是你的原始正则表达式,如果它起作用的话,也应该将每个结果返回到一个子数组中,因为有一组外部括号。
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,所以这不是问题。