Вот кодрубин и регулярное выражение группировки
string = "Looking for the ^[cows]"
footnote = string[/\^\[(.*?)\]/]
Я надеялся, что footnote
будет равна cows
Что я получаю это footnote
равно ^[cows]
Любая помощь?
Спасибо!
Вот кодрубин и регулярное выражение группировки
string = "Looking for the ^[cows]"
footnote = string[/\^\[(.*?)\]/]
Я надеялся, что footnote
будет равна cows
Что я получаю это footnote
равно ^[cows]
Любая помощь?
Спасибо!
Вы можете указать, какой захват группы вы хотите с second argument к []
:
string = "Looking for the ^[cows]"
footnote = string[/\^\[(.*?)\]/, 1]
# footnote == "cows"
.match() может быть лучшим решением в некоторых случаях, но это лучше всего подходит для меня. – crowhill
Если вы хотите, чтобы захватить подгруппы, вы можете использовать Regexp#match
:
r = /\^\[(.*?)\]/
r.match(string) # => #<MatchData "^[cows]" 1:"cows">
r.match(string)[0] # => "^[cows]"
r.match(string)[1] # => "cows"
Согласно String
documentation, то Метод #[]
принимает второй параметр, целое число, которое определяет возвращаемую группу соответствия:
a = "hello there"
a[/[aeiou](.)\1/] #=> "ell"
a[/[aeiou](.)\1/, 0] #=> "ell"
a[/[aeiou](.)\1/, 1] #=> "l"
a[/[aeiou](.)\1/, 2] #=> nil
Вы должны использовать footnote = string[/\^\[(.*?)\]/, 1]
альтернатива использованию захвата группы, а затем извлечения его содержимое, чтобы соответствовать только то, что вы хотите. Вот три способа сделать это.
# 1 Используйте положительный просмотра назад и положительный предпросмотр
string[/(?<=\[).*?(?=\])/]
#=> "cows"
# 2 Использование матча, но забывают (\K
) и положительный предпросмотр
string[/\[\K.*?(?=\])/]
#=> "cows"
# 3 Использование String#gsub
string.gsub(/.*?\[|\].*/,'')
#=> "cows"
примечание равно '^ [cows]', потому что это то, что вы явно запрашиваете в шаблоне '\^\ [(. *?) \]'. Подстрока 'cows' находится в особой переменной' $ 1' (группа первая). Имейте в виду, что строка [regexp] вернет совпадение всего шаблона, а не групп. – yeyo