Если вы знаете, что квадратные скобки всегда будут встречаться в сбалансированных парах, как это происходит в вашем примере, вы можете сделать отрицательный прогноз на несбалансированную заключительную скобку после слова.Если открывающая скобка не после слова, она должна быть перед словом.Пример:
foo.gsub(/\b#{w}\b(?![^\[]*\])/) {|s| "[#{w}]"}
Другой вариант - сопоставить или пару скобок и все, что внутри них, или целевой строке.Если это последовательность, заключенная в скобки, которую вы выбрали, вы подключаете ее обратно;в противном случае вы добавляете скобки к соответствующей строке и вставляете , что in. В этом случае это даже проще: вы можете просто захватить все внутри скобки в одной группе или целевую строку в другойgroup, затем используйте метапоследовательность \+
, чтобы добавить содержимое любой группы с добавленными скобками.Пример:
foo.gsub(/\[([^\]\[]*)\]|(\b#{w}\b)/, '[\+]')
увидеть их в действии на ideone