2012-06-12 1 views
2

У меня есть следующая строка:В рубина, получить содержание в скобках

Затмение Developments (Шотландия) Ltd т/Martin & Co (Glasgow South)

Мне нужно, чтобы получить последний (всегда последнее, но иногда единственное) скобки, поэтому в этом случае «Глазго Юг».

Я знаю, что должен использовать .sub, но не может найти правильное регулярное выражение.

ответ

20

Обычно sub используется для под -установки. Что вам нужно scan:

test = "Eclipse Developments (Scotland) Ltd t/a Martin & Co (Glasgow South)" 

test.scan(/\(([^\)]+)\)/).last.first 
# => "Glasgow South" 

Причина нечетной .last.first вызова scan возвращает массив массивов по умолчанию. Вам нужен первый (и единственный) элемент последнего совпадения.

Воплощение, что регулярное выражение, которое может быть шиповатым для непосвященных:

\( # A literal bracket followed by... 
(  # (Memorize this) 
[^)]+ # One or more (+) characters not in the set of: closing-bracket [^)] 
)  # (End of memorization point) 
\)  # ...and a literal closing bracket. 
+0

Отлично, это нормально работает в двух экземплярах. Я забыл упомянуть, но иногда строка содержит только один набор круглых скобок (которые нужно будет выбрать). Сожалею! – rickyduck

+1

Если вы посмотрите на результат метода 'scan', который лучше всего сделать внутри' irb', вы можете выбрать любые нужные вам биты. Это просто извлекает вещи внутри скобок, поэтому '[0] [0]' будет содержимым первых скобок, '[1] [0]' для второго набора и т. Д. Помните, что 'last' вытащит последний набор, который для одного набора также является первым. – tadman

+0

Извините, это был мой маппет. Огромное спасибо – rickyduck

2

Regexps жадные; если вы попросите .*, он будет соответствовать как можно больше. По этой причине будут работать следующие:

test = "Eclipse Developments (Scotland) Ltd t/a Martin & Co (Glasgow South)" 
test =~ /.*\((.*)\)/ 
answer = $1 
# => "Glasgow South"