В Ruby 1.8.7 заменить регулярное выражение, если строка не связана с конкретным текстом - PullRequest
2 голосов
/ 16 декабря 2010

Дано - я использую Ruby 1.8.7 и поэтому не могу использовать отрицательный взгляд назад. Я также знаю о онигурума , но ищу решения без него.

Если у меня есть:

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

Как я могу изменить это:

foo.gsub(/\b#{w}\b/i) {|s| "[#{w}]"}

Так что строка, заключенная в любом месте между [], не совпадает, например, желаемый результат:

"[string] and [string] [foo and string stuff] [string] and strings foostring [string]" 

Спасибо!

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Если вы знаете, что квадратные скобки всегда будут встречаться в сбалансированных парах, как это происходит в вашем примере, вы можете сделать отрицательный прогноз на несбалансированную заключительную скобку после слова.Если открывающая скобка не после слова, она должна быть перед словом.Пример:

foo.gsub(/\b#{w}\b(?![^\[]*\])/) {|s| "[#{w}]"}

Другой вариант - сопоставить или пару скобок и все, что внутри них, или целевой строке.Если это последовательность, заключенная в скобки, которую вы выбрали, вы подключаете ее обратно;в противном случае вы добавляете скобки к соответствующей строке и вставляете , что in. В этом случае это даже проще: вы можете просто захватить все внутри скобки в одной группе или целевую строку в другойgroup, затем используйте метапоследовательность \+, чтобы добавить содержимое любой группы с добавленными скобками.Пример:

foo.gsub(/\[([^\]\[]*)\]|(\b#{w}\b)/, '[\+]')

увидеть их в действии на ideone

1 голос
/ 16 декабря 2010

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

foo = "string and string [foo and string stuff] string and strings foostring string"
w = "string"

brackets = []
a = foo.gsub( /\[[^\]]+\]/ ){ |b| brackets << b; "-^#{brackets.length-1}^-" }
b = a.gsub(/\b#{w}\b/i) {|s| "[#{w}]" }
c = b.gsub( /-\^\d+\^-/ ){ |s| brackets[ s[/\d+/].to_i ] }

p a, b, c
#=> "string and string -^0^- string and strings foostring string"
#=> "[string] and [string] -^0^- [string] and strings foostring [string]"
#=> "[string] and [string] [foo and string stuff] [string] and strings foostring [string]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...