Ваш первый ([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
.
Таким образом, вы должны иметь возможность сопоставить что-либо до требуемого шаблона и поместить его в количественную группу. В easies путь здесь является использование ленивого согласования точек (.*?
), который будет соответствовать либо 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)
при запуске шаблона, чтобы обеспечить такое же поведение для точки.
Попробуйте '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") '. – nrussell
спасибо, получил его сейчас – chiefr
Вы можете посмотреть функцию 'str_locate_all()' в пакете stringr. и пакет stringi также обеспечивает аналогичные функции. – Dave2e