使用grepl在R中使用正则表达式提取日期

时间:2014-12-30 19:18:02

标签: regex

我提前道歉,这可能是一个重复的问题。但是,我只花了最后一小时覆盖stackoverflow,似乎无法找到解决方案。我在R中使用grepl尝试在字符串中提取一些日期,并注意到意外的行为。

假设我们有一个字符串向量

mystring = c("12-03-99", "A", "B")
date = grepl("[1-9]{2}", mystring)

> date [1] TRUE FALSE FALSE

这对我有意义。但是,如果我尝试在正则表达式中添加“ - ”,则会产生意外行为。例如

mystring = c("12-03-99", "A", "B")
date = grepl("[1-9]{2}-[1-9]{2}-[1-9]{2}", mystring)

> date [1] FALSE FALSE FALSE

为什么第二个例子对向量mystring的第一个元素(“12-03-99”)产生False?

提前感谢您的帮助!

文森特

1 个答案:

答案 0 :(得分:4)

Regex101

这是一个简单的错误:

您使用的是[1-9],但您需要[0-9]

由于您的日期12-03-99中包含0,因此您需要在角色数组中使用它。

尝试:

mystring = c("12-03-99", "A", "B")
date = grepl("[0-9]{2}-[0-9]{2}-[0-9]{2}", mystring)

date = grepl("\d{2}-\d{2}-\d{2}", mystring)

<强>正则表达式:

[0-9]{2}-[0-9]{2}-[0-9]{2}

Regular expression visualization

Debuggex Demo


注意

这也会将00-00-00作为有效日期。

要解决此问题,只需使用以下正则表达式:

[0-9]?[1-9]-[0-9]?[1-9]-[0-9]?[1-9]

这可以缩短为:

\d?[1-9]-\d?[1-9]-\d?[1-9]

然后更改为Regex101

(\d?[1-9]-){2}\d?[1-9]