【问题标题】:repetition quantifier grepl重复量词 grepl
【发布时间】:2016-11-01 15:42:24
【问题描述】:

我正在尝试检查一个字符串是否包含 2 个或更多日期值

给定字符串包含四个日期值,但 grepl 返回 FALSE

无法让 grepl 检测 strng 中的所有日期实例

> strng
[1] "SMART PRODUCTS 0.50 0.76 0.79 05/09/16 1000 1.02 1.02 27/06/16 17/06/11 27/06/16 0"
> grepl("([0-9][0-9]/[0-9][0-9]/[0-9][0-9]){1}", strng)
[1] TRUE
> grepl("([0-9][0-9]/[0-9][0-9]/[0-9][0-9]){2,}", strng)
[1] FALSE

【问题讨论】:

  • 试试grepl("(.*[0-9][0-9]/[0-9][0-9]/[0-9][0-9].*){2,}", x);您的第二个模式是搜索两个连续的事件,例如grepl("([0-9][0-9]/[0-9][0-9]/[0-9][0-9]){2,}", "27/06/1617/06/11").
  • 您可能想查看 stringr 包中的函数 str_locate_all( )。而stringi包也提供了类似的功能。

标签: r regex grepl


【解决方案1】:

您的第一个 ([0-9][0-9]/[0-9][0-9]/[0-9][0-9]){1} 模式实际上可以找到 4 次出现:05/09/1627/06/1617/06/1127/06/16

现在,当您尝试设置限制量词以匹配 2 次或更多次出现时,整个组应该匹配模式的 2 次或多次。这与量化像a 这样的简单模式相同:a{2,} 将在baaac 中找到aaa,但在bacada 中找不到任何匹配项。

因此,您需要能够匹配所需模式之前的任何内容并将其放入量化组。这里最简单的方法是使用惰性点匹配(.*?),它将匹配任何 0+ 字符,但尽可能少):

(.*?[0-9][0-9]/[0-9][0-9]/[0-9][0-9]){2,}
 ^^^

查看regex demo,它不会在SMART PRODUCTS 0.50 0.76 0.79 17/06/11 0 中找到任何匹配项,但会匹配相关字符串。

注意:如果您在grepl 中使用正则表达式而没有perl=TRUE,则它是一个TRE 正则表达式,. 将匹配包括换行符在内的任何字符。如果您使用perl=TRUE,点将不匹配换行符,您需要在模式开头添加(?s) 以对点强制执行相同的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多