Квантификатор повторения 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) на старте паттерна применить такое же поведение для точки.

Другие вопросы по тегам