2015-03-26 2 views
0

Вот кодрубин и регулярное выражение группировки

string = "Looking for the ^[cows]" 
footnote = string[/\^\[(.*?)\]/] 

Я надеялся, что footnote будет равна cows

Что я получаю это footnote равно ^[cows]

Любая помощь?

Спасибо!

+0

примечание равно '^ [cows]', потому что это то, что вы явно запрашиваете в шаблоне '\^\ [(. *?) \]'. Подстрока 'cows' находится в особой переменной' $ 1' (группа первая). Имейте в виду, что строка [regexp] вернет совпадение всего шаблона, а не групп. – yeyo

ответ

4

Вы можете указать, какой захват группы вы хотите с second argument к []:

string = "Looking for the ^[cows]" 
footnote = string[/\^\[(.*?)\]/, 1] 
# footnote == "cows" 
+0

.match() может быть лучшим решением в некоторых случаях, но это лучше всего подходит для меня. – crowhill

0

Если вы хотите, чтобы захватить подгруппы, вы можете использовать Regexp#match:

r = /\^\[(.*?)\]/ 
r.match(string) # => #<MatchData "^[cows]" 1:"cows"> 
r.match(string)[0] # => "^[cows]" 
r.match(string)[1] # => "cows" 
0

Согласно 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]

0

альтернатива использованию захвата группы, а затем извлечения его содержимое, чтобы соответствовать только то, что вы хотите. Вот три способа сделать это.

# 1 Используйте положительный просмотра назад и положительный предпросмотр

string[/(?<=\[).*?(?=\])/] 
    #=> "cows" 

# 2 Использование матча, но забывают (\K) и положительный предпросмотр

string[/\[\K.*?(?=\])/] 
    #=> "cows" 

# 3 Использование String#gsub

string.gsub(/.*?\[|\].*/,'') 
    #=> "cows" 
Смежные вопросы