Regexp::Union
объединяет ваши скороговорки. Если предоставляются строки, они экранируются методом. Если вы предоставляете регулярные выражения, параметры сохраняются, а символы не экранируются:
regex_data = ['alpha', 'bravo', 'charlie', '1 + 1 = 2']
Regexp.union(regex_data)
#=> /alpha|bravo|charlie|1\ \+\ 1\ =\ 2/
Чтобы не допустить экранирования символа регулярного выражения или если вы хотите добавить некоторые опции, вам сначала нужно преобразовать строки в регулярные выражения. Это можно сделать с помощью Array#map
, предоставив строку конструктору Regexp
и, возможно, некоторые параметры регулярного выражения. При использовании метода Regexp::new
символы по умолчанию не экранируются:
regexes = regex_data.map { |str| Regexp.new(str) }
Regexp.union(regexes)
#=> /(?-mix:alpha)|(?-mix:bravo)|(?-mix:charlie)|(?-mix:1 + 1 = 2)/
options = Regexp::EXTENDED | Regexp::IGNORECASE # See Regexp::new reference above
regexes = regex_data.map { |str| Regexp.new(str, options) }
Regexp.union(regexes)
#=> /(?ix-m:alpha)|(?ix-m:bravo)|(?ix-m:charlie)|(?ix-m:1 + 1 = 2)/
Если вы хотите получить строку с экранированными символами регулярных выражений, сначала вам нужно будет передать ее через Regexp::escape
и передать результат конструктору.
regexes = regex_data.map { |str| Regexp.new(Regexp.escape(str), options) }
Regexp.union(regexes)
#=> /(?ix-m:alpha)|(?ix-m:bravo)|(?ix-m:charlie)|(?ix-m:1\ \+\ 1\ =\ 2)/
Если все значения должны быть chomp
ed, подумайте сначала об этом, чтобы вам не приходилось смешивать строковую логику с логикой регулярного выражения:
regex_data = regex_data.map(&:chomp)
# also written as: regex_data = regex_data.map { |str| str.chomp }
# or if you don't mind mutating your variable
regex_data.map!(&:chomp)