2015-12-07 2 views
0

У меня есть строка, как это: raw_string = "(a=1)(b=2)(c=3)"Регулярного выражения - получить несколько матчей в каждую группу

Я хотел бы, чтобы соответствовать этому и получить значение в каждом наборе скобок, и получить каждый результат в группе. Например:

группа 0 = "a=1"

группа 1 = "b=2" и так далее ..

Я попытался /(\(.*\))/g, но это не похоже на работу. Может кто-то помочь мне с этим?

спасибо!

+0

Как вы претендуете регулярное выражение? Из быстрого поиска, похоже, вы должны использовать 'string.scan (/ regex /)'. Кроме того, вы, вероятно, не хотите '. *', Поскольку он жадный и может съесть все ваши данные. Я бы изменил его на '. *?', Или еще лучше, '[^)] +' (совпадение с любым символом, который не является закрывающим). – nickb

+0

Думаю, вам просто нужно ['s.scan (/ \ (([^()] +) \) /)'] (http://rubular.com/r/mct68IbSif). Соответствует ли [этот код] (http://ideone.com/Qwxc6Q) вашим потребностям? –

+0

Нам нужно гораздо лучшее описание того, как вы пробовали: Покажите нам минимальный код, который демонстрирует проблему. Stack Overflow не является сайтом «дать мне код», поэтому мы помогаем вам исправить ваш код. Мы ожидаем, что вы попытались, столкнулись с проблемой, попробовали снова, столкнулись с другим, и как только вы исчерпали свои варианты, спросите. См. Http://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users/261593#261593 и [ask]. –

ответ

3
str = "(a=1)(b=2) (c=3)" 

Как было предложено в комментарии по @stribizhev:

r =/
    \(  # Match a left paren 
    ([^\)]+) # Match >= 1 characters other than a right paren in capture group 1 
    \)  # Match a right paren 
    /x  # extended/free-spacing regex definition mode 

str.scan(r).flatten 
    #=> ["a=1", "b=2", "c=3"] 

Примечание ([^\)]+) может заменить на (.+?), что делает его ленивым матч на любые символы, как я сделал в этом альтернативном регулярное выражение, которое использует lookarounds, а не захват группу:

r =/
    (?<=\() # Match a left paren in a positive lookbehind 
    .+?  # Match >= 1 characters lazily 
    (?=\)) # Match a right paren in a positive lookahead 
    /x 

Здесь может быть просмотр назад заменен \(\K, в котором говорится, «Совпадение ля ft paren, тогда забудьте обо всем, что соответствует до сих пор ».

Наконец, вы можете использовать String#split на правой, то левой Paren, возможно, разделенных пробелами, а затем удалить первый левый и правый последний Паренс:

str.split(/\)\s*\(/).map { |s| s.delete '()' } 
    #=> ["a=1", "b=2", "c=3"] 

Не было бы хорошо, если бы мы могли написать s.strip(/[()]/) ?

+0

@sawa, делал это, когда вы оставили свой комментарий. Первоначально я этого не делал, потому что ... –

+0

... @ stribizhev сделал это в комментарии, но поскольку он, кажется, не предлагает ответа ... (Вы думали, что в комментарии можно указать только одного пользователя?) –

+0

Я был занят детьми, теперь они ушли спать :) –

2

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

-2

Просто чтобы показать, что вы можете получить их в произвольное количество групп захвата:

"(a=1)(b=2)(c=3)"[/#{'(?:\((.*?)\))?' * 99}/] 
[$1, $2, $3] 
#=> ["a=1", "b=2", "c=3"] 
+0

Это не произвольно. Он зафиксирован на 99. И независимо от того, насколько велика вы установили это число, вы не можете быть уверены (помимо ограничения на машину), если сгенерированное регулярное выражение имеет достаточное количество совпадений, чтобы соответствовать всем вхождениям шаблона, пока вы фактически не сравните строку, используя регулярное выражение. – sawa

+0

Уверенный, что вы можете сказать о 'str.length'? – pguardiario

+0

Хорошо, это ничто. Чтобы более точно рассказать о моем слове: вы не можете быть уверены, пока не изучите строку каким-либо образом заранее, что приведет к победе/уменьшению цели использования регулярного выражения в соответствии с шаблоном. – sawa