2016-11-01 2 views
1

я пытаюсь проверить, содержит ли строка 2 или более значение датыповторение квантор grepl

данной строки содержит четыре значения даты, но 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 
+0

Попробуйте '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

+0

спасибо, получил его сейчас – chiefr

+0

Вы можете посмотреть функцию 'str_locate_all()' в пакете stringr. и пакет stringi также обеспечивает аналогичные функции. – Dave2e

ответ

0

Ваш первый ([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) при запуске шаблона, чтобы обеспечить такое же поведение для точки.

Смежные вопросы