regex - R 中日期的正则表达式

标签 regex r

我正在尝试在 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/

相关文章:

regex - Perl - 如何匹配不完全相同的字符串?

Java:使用正则表达式从 block 注释中去除斜杠和星号

mysql - MSSQL 和 MySQL 之间使用正则表达式的 SQL 表达式区别

r - 如何修改R程序以支持RHadoop

r - 模糊字符串匹配与合并

R:每个参与者的平均值,直到 column_date

regex - 如何在 Perl 中的匹配大括号之间提取字符串?

java - Android Java 正则表达式模式

r - 当作为函数参数提供时获取列表变量的名称

r - Knit 钩子(Hook)在 tex 文件中的\documentclass 行之前添加代码,以避免选项与 xcolor 冲突