重复量词 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/16
、27/06/16
、17/06/11
、27/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)
以对点强制执行相同的行为。
我正在尝试检查一个字符串是否包含 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/16
、27/06/16
、17/06/11
、27/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)
以对点强制执行相同的行为。