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

标签 regex

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

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

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

> 日期 [1] 真假假

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

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

> 日期 [1] 假假假假

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

预先感谢您的帮助!

文森特

最佳答案

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]

关于regex - 使用 grepl 在 R 中使用正则表达式提取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711215/

相关文章:

c++ - 使用带有 char * 的正则表达式迭代器

java - 正则表达式 : some groups missing

java - Java 中的字符串模式不匹配

JavaScript 拆分而不丢失字符

regex - UNIX 中的子字符串

regex - Node/V8 中是如何实现正则表达式匹配的?

java - Jenkins groovy 正则表达式匹配字符串 : Error: java. io.NotSerializableException : java. util.regex.Matcher

javascript - 除非发现某个值是引用文本的一部分,否则如何删除该值的所有实例?

c# - 正则表达式:匹配字符集具体次数

ruby-on-rails - 如何在 [а-я] 正则表达式字符间隔中包含 ё