Хотя я был сначала убежден в ответе БродиГ, кажется, что [0-9] n раз и [0-9] {n} действительно отличаются друг от друга, по крайней мере, для двигателя «tre» regexp. Согласно http://www.regular-expressions.info {} оператор жадный, [0-9] нет.
Поэтому правое регулярное выражение в моем случае должен быть:
sub("(.*?)_([0-9]{8}?)(.*)$","\\2",a)
внесение всех различий:
sub("(.*?)_([0-9]{8})(.*)$","\\2",a)
[1] "20141024" "20141130" "/Cat/LIQUID" "20141107" "20141018"
[6] "20141205"
sub("(.*?)_([0-9]{8}?)(.*)$","\\2",a)
[1] "20141024" "20141115" "/Cat/LIQUID" "20141206" "20141017"
[6] "20141204"
И даже
> sub("(.*)_([0-9]{8}?)(.*)$","\\2",a)
[1] "20141024" "20141115" "/Cat/LIQUID" "20141206" "20141017"
[6] "20141204"
Интерпретации: 1) Тр считает? как «оценить следующий атом в первый раз, когда вы сможете совместить этот атом». Это всегда верно для ". ?" как и все, и переключается на _ [0-9] {8}. При достижении первой группы из 6 чисел, если {} не является жадным (нет?), Так как (.) соответствует также первым 8 числам, поиск продолжает видеть, существует ли другое появление «_ [0-9] { 8} "можно найти на линии. Если он соответствует второму набору из 8 цифр, он также запоминает его как соответствующий шаблон, затем он достигает конца строки, последний совпадающий шаблон сохраняется, а [0-9] {8} сопоставляется со вторым набором из 8 номера.
2) Когда {} оператор модифицирован? Поиск останавливается при первом просмотре 8 чисел, проверьте, можно ли сопоставить _ (. *) С остальными. Он может, поэтому он возвращает первый набор из 8 чисел.
Обратите внимание, что Perl регулярное выражение двигатель работает по-другому,
1)? после {} ничего не меняет:
sub("(.*)_([0-9]{8})","\\2",a,perl=TRUE)
[1] "20141024" "20141130" "/Cat/LIQUID" "20141107" "20141018"
[6] "20141205"
sub("(.*)_([0-9]{8}?)","\\2",a,perl=TRUE)
[1] "20141024" "20141130" "/Cat/LIQUID" "20141107" "20141018"
[6] "20141205"
2) the? . Приложенные к * делает его остановиться на первый наборе 8 цифр:
sub("(.*?)_([0-9]{8}).*","\\2",a,perl=TRUE)
[1] "20141024" "20141115" "/Cat/LIQUID" "20141206" "20141017"
[6] "20141204"
sub("(.*)_([0-9]{8}).*","\\2",a,perl=TRUE)
[1] "20141024" "20141130" "/Cat/LIQUID" "20141107" "20141018"
[6] "20141205"
Из этих двух наблюдений, кажется, что два двигателя интерпретировать иначе алчность в двух различных случаях.Я всегда считал, что концепция жадности немного расплывчата ...
В семантическом значении эти два шаблона являются точно такими же, единственное различие, которое я знаю, заключается в том, что любые регулярные выражения более эффективны с одним из этих двух синтаксисов для внутренние причины, но ничто из этого не объясняет разные результаты, которые вы получаете здесь. –
Интересно, если вы измените круглые скобки на '' (. *)? _ ([0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0 -9] [0-9]). * $ "' Он работает –
@RichardScriven, но это меняет смысл регулярного выражения, см .: 'sub (" (. *)? "," "," ___X ", perl = T) 'VS' sub ("(. *?)", "", "___x", perl = T) '. В этом случае это не имеет значения. – BrodieG