我正在尝试在 R 中创建一个正则表达式来搜索某些文本中的日期。由于我无法控制实际的日期格式,我试图“捕获”所有可能的 dd/mm/yy 格式(一位或两位数字的月份,两位或四位数字的年份,可选的一位或两位数字的日期,以及一系列分隔符(“/”、“-”、“.”),可能包含空格)。
到目前为止我的正则表达式是:
pattern = "(\\d{0,2}[/\\.-])?[ ]?(\\d{1,2}[ ]*[/\\.-]|January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Febr|Mar|Apr|Jun|Jul|Aug|Sept|Sep|Oct|Nov|Dec|Jan\\.|Feb\\.|Febr\\.|Mar\\.|Apr\\.|Jun\\.|Jul\\.|Aug\\.|Sept\\.|Sep\\.|Oct\\.|Nov\\.|Dec\\.)[ ]*[']?\\d{2,4}"
这似乎适用于大多数格式,但它包含一个我发现很难理解的错误:
str_extract_all("09/11 /1985", pattern = pattern) # returns: "09/11 /1985"
str_extract_all(" 09/11 /1985", pattern = pattern) # returns: c("09/11", "1985")
这听起来非常奇怪。由于我没有包括环顾四周,因此开头的额外空间应该没有什么区别。结果却另有说法。我做错了什么?
最佳答案
问题出在正则表达式的第一部分,您可能会尝试匹配日期:(\\d{0,2}[/\\.-])?[ ]?
它可以选择匹配 0 到 2 天,后跟您的分隔符之一。然后它可以选择匹配一个空格。
在 09/11/1985
的情况下,这部分与前导空格匹配,留下 09 匹配月份,11 匹配年份。
要消除此行为,您应该将空格移至可选组中。您可能还想匹配 1 或 2 位数字,否则它将匹配前导分隔符。
所以我会将第一部分重写为 (\\d{1,2}[/\\.-][ ]?)?
还有一些其他方面可以改进,例如:
January|Jan|Jan\\.
与Jan(?:\\.|uary)?
相同
- 考虑使用非捕获组
关于regex - R 中日期的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482882/