重复量词 grepl

repetition quantifier grepl

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

给定的字符串包含四个日期值,但 grepl returns 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

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

现在,当您尝试将限制量词设置为匹配 2 次或更多次出现时,整个组 应该匹配模式 at 的 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) 以对点强制执行相同的行为。