Подтвердить что ты не робот

Ruby regex, что означает \l для gsub

Что делает \1?

Например

"foo bar bag".gsub(/(bar)/,'car\1')

Я считаю, что это имеет какое-то отношение к тому, как вы используете круглые скобки, но я не уверен. Может ли кто-нибудь объяснить это мне? И можете ли вы делать такие вещи, как \2? Если да, что бы это сделать?

4b9b3361

Ответ 1

Каждый элемент, который вы окружите скобкой в ​​поисковой части, будет соответствовать числу \1, \2 и т.д. в замещающей части.

В вашем примере есть только один элемент, окруженный скобками, элемент "(bar)", поэтому в любом месте, где вы помещаете \1, находится часть, находящаяся в скобках, будет заменена. Вы можете ввести \1 несколько раз, что удобно, если вы хотите повторить найденный элемент, чтобы вы могли законно написать car\1\1\1, а "bar" будет заменено в три раза.

Нет смысла использовать \2, потому что только один элемент окружен скобками. Однако, если у вас есть (bar)(jar), то \1 будет представлять "bar", а \2 будет представлять "jar".

Вы можете делать такие вещи:

\1\2\1\2\2\1

который станет следующим:

barjarbarjarjarbar

Вот пример реального мира, когда это пригодится. Скажем, у вас есть список имен, например:

Jones, Tom  
Smith, Alan  
Smith, Dave  
Wilson, Bud

и вы хотите изменить его на это:

Tom Jones  
Alan Smith  
Dave Smith  
Bud Wilson

Вы можете выполнить поиск:

(.+), (.+)

и замените на:

\2 \1

Вы также можете заменить на:

\1: \2 \1  

Что станет:

Jones: Tom Jones  
Smith: Alan Smith  
Smith: Dave Smith  
Wilson: Bud Wilson

Ответ 2

Вообще говоря, \N заменяется на N-ю группу, указанную в регулярном выражении. Первая согласованная группа ссылается на \1, а максимальное число групп равно 9.

Некоторые примеры:

# wrap every integer into brackets
'1 2 34'.gsub(/(\d+)/, '[\1]')
# => "[1] [2] [34]"

# gsub with two groups: swap couples of integers
'<1,2> <3,4>'.gsub(/(\d+),(\d+)/, '\2,\1')
# => "<2,1> <4,3>" 

# you can reference the same group more than once
'1 2 34'.gsub(/(\d+)/, '<\1,\1>')
#  => "<1,1> <2,2> <34,34>"

# a slightly more complex example
'Jim Morrison'.sub(/([A-Z])[a-z]+ ([A-Z][a-z]+)/, '\2 \1.')
# => "Morrison J."

Ответ 3

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

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