2016-07-31 5 views
2

я получил действительно путают об использовании обратных ссылокобратная ссылка на R

strings <- c("^ab", "ab", "abc", "abd", "abe", "ab 12") 

gsub("(ab) 12", "\\1 34", strings) 
[1] "^ab" "ab" "abc" "abd" "abe" "ab 12" 

gsub("(ab)12", "\\2 34", strings) 
[1] "^ab" "ab" "abc" "abd" "abe" "ab 12" 

Я знаю, что \ 1 относится к первому подмаски (чтение слева), \ 2 относится ко второму подмаски, и так далее. Но я не знаю, что означает этот подшаблон. Почему \ 1 и \ 2 дают разные выход

gsub("(ab)", "\\1 34", strings) 
[1] "^ab 34" "ab 34" "ab 34c" "ab 34d" "ab 34e" "ab 34 12" 

Кроме того, почему я удаляю 12 после того, как (AB), то это дает такой результат?

gsub("ab", "\\1 34", strings) 
[1] "^ 34" " 34" " 34c" " 34d" " 34e" " 34 12" 

Кроме того, что, если ab не имеет круглых скобок? Что это значит?

Я действительно перепутались с обратной ссылки и надеюсь, что кто-то может объяснить логику ясно

+1

Это не «подшаблон», а группа захвата *. Если вы указали в Google, вы найдете много ресурсов Любой шаблон внутри скобок '()' является группой захвата. В любом случае, я не получаю одинаковых результатов в вашем первом примере. Последний элемент - 'ab 34', а не' ab 12'. – nicola

+0

Да, вы правы , я вставил неверный вывод. –

ответ

4

В первом и втором случае, есть одна группа захвата т.е. группы, снятые с помощью (...), однако в первой замены корпуса мы используйте правильную обратную связь, т. е. первую группу захвата, а во втором - \\2, которая никогда не существовала.

Чтобы проиллюстрировать это

gsub("(ab)(d)", "\\1 34", strings) 
#[1] "^ab" "ab" "abc" "ab 34" "abe" "ab 12" 

здесь мы используем две группы захвата ((ab) и (d)), в замене мы имеем первый (\\1 обратной ссылки), а затем пробел, затем 34. Таким образом, в «строк "это будет соответствовать 4-й элемент, т.е.„абд“, получить„AB“для первой обратной ссылки (\\1) с последующим пробелом и 34.

Предположим, что мы делаем со второй обратной ссылки

первым удаляется и мы имеем «D», а затем пространство и 34.

Предположим, что мы используем общий случай вместо определенных символов

gsub("([a-z]+)\\s*(\\d+)", "\\1 34", strings) 
#[1] "^ab" "ab" "abc" "abd" "abe" "ab 34" 
gsub("([a-z]+)\\s*(\\d+)", "\\2 34", strings) 
#[1] "^ab" "ab" "abc" "abd" "abe" "12 34" 

Обратите внимание, как значения изменяются в последнем элементе, переключаясь с первой обратной ссылки на вторую. Используемый шаблон представляет собой одну или несколько строчных букв (внутри группы захвата (([a-z]+)), за которой следует ноль или больше места (\\s*), за которым следует одно или несколько номеров во второй группе захвата ((\\d+)) (это соответствует только последнему элементу 'stringings'). В замене мы используем первую и вторую обратную ссылку, как показано выше.

+0

Это имеет смысл. Но я все еще смущен о 'gsub (" ([az] +) \\ s * (\\ d +) "," \\ 2 34 ", строки) 'Как вы сказали, он соответствует" ab 12 ", и вы использовали \\ 2 для захвата второй группы. Для меня это означает, что когда вы захватите группу, эта группа будет исправлена, поэтому «ab 12» будет переключено на «34 12», но не «12 34» –

+0

@BrattSwan. В соответствующем примере я заменяю вторая группа захвата, то есть '(\\ d +') ', поэтому возвращает' 12'. Поскольку мы также создаем пространство, за которым следует 34, оно будет «12 34». Если вы хотите перейти на «34 12», регулярное выражение будет '' 34 \\ 2 "'. – akrun

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