Квантификатор повторения grepl
Я пытаюсь проверить, содержит ли строка 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
1 ответ
Ты первый ([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 или более вхождениям, вся группа должна соответствовать 2 или более разам паттерна подряд. Это то же самое, что количественно определить простой шаблон, такой как a
: a{2,}
найду aaa
в baaac
, но не найдет совпадений в bacada
,
Таким образом, вы должны быть в состоянии сопоставить что-либо до требуемого шаблона и поместить его в количественную группу. Самый простой способ здесь - использовать ленивое сопоставление точек (.*?
), который будет соответствовать любым 0+ символам, но как можно меньше):
(.*?[0-9][0-9]/[0-9][0-9]/[0-9][0-9]){2,}
^^^
Смотрите демо-версию регулярного выражения, которая не найдет совпадений в SMART PRODUCTS 0.50 0.76 0.79 17/06/11 0
, но будет соответствовать рассматриваемой строке.
ПРИМЕЧАНИЕ: если вы используете регулярное выражение в grepl
без perl=TRUE
, это регулярное выражение TRE, и .
будет соответствовать любому символу, включая символы перевода строки. Если вы используете perl=TRUE
, точка не будет соответствовать символам перевода строки, вам нужно будет добавить (?s)
на старте паттерна применить такое же поведение для точки.