Регулярные выражения ruby - PullRequest
0 голосов
/ 04 марта 2011
"(fname:John OR lname:Doe) (male OR female)"

"(fname:John OR address:1200 main str va) (male OR female)"

"(address:1200 main str va OR fname:John ) (male OR female)"

"(fname:John OR address:1200 main str va OR lname:Doe) (male OR female)"

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

Например, для второй строки модифицированный вывод должен быть

"(fname:John OR address:(1200 main str va)) (male OR female)"

Я пытался сделать это с помощью регулярных выражений, но я борюсь с тем, как сказать регулярному выражению искать, пока вы не встретите мир ИЛИ, но если вы встретите "(" или ")", то остановитесь.

1 Ответ

2 голосов
/ 04 марта 2011

e.gsub /address:(.*?(?=( *OR| *\))))/, 'address:(\1)'

Или с оберткой для тестового набора ...

[ "(fname:John OR lname:Doe) (male OR female)",
  "(fname:John OR address:1200 main str va) (male OR female)",
  "(address:1200 main str va OR fname:John ) (male OR female)",
  "(fname:John OR address:1200 main str va OR lname:Doe) (male OR female)"
].each do |e|
  puts e.gsub /address:(.*?(?=( *OR| *\))))/, 'address:(\1)'
end

Возвращение ...

(fname:John OR lname:Doe) (male OR female)
(fname:John OR address:(1200 main str va)) (male OR female)
(address:(1200 main str va) OR fname:John ) (male OR female)
(fname:John OR address:(1200 main str va) OR lname:Doe) (male OR female)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...