Должен ли ключ хеша gsub быть строкой, а не регулярным выражением? - PullRequest
1 голос
/ 15 марта 2011

Я хочу сделать последовательность gsub s для одной строки, поэтому я использовал тот факт, что gsub может принять хеш в качестве второго аргумента.Одна вещь, которую я хотел сделать с gsub, - это преобразовать последовательность из одного или нескольких пробелов / табуляций в один пробел, поэтому у меня есть что-то по существу следующим образом:

gsub(/[ \t]+/, {/[ \t]+/ => ' '})

В моем реальном кодеПервый аргумент представляет собой объединение регулярного выражения, которое я дал здесь, а второй аргумент включает больше пар ключ-значение.

Теперь, когда я применяю это к строке, все пробелы / табуляции удаляются.Я предполагаю, что это потому, что совпадение с первым аргументом не считается совпадением с ключом [ \t] во втором аргументе (хэш).Соответствие во втором хэш-аргументе ищет только точное совпадение строки, а не совпадение с регулярным выражением?Если так, есть ли способ обойти это?

Ответы [ 3 ]

1 голос
/ 16 марта 2011

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

list = Hash.new{|h,k|if  /\s+/ =~ k then ' ' else k end}
list['foo'] = 'bar'
list['apple'] = 'banana'

p "appleabc\t  \tabc  apple foo".gsub(/\w+|\W+/,list)
#=> "appleabc abc banana bar"
p list
#=>{"foo"=>"bar", "apple"=>"banana"} no garbage
1 голос
/ 16 марта 2011

Согласно документам, gsub с хэшем в качестве второго параметра соответствует только литеральным строкам:

'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*')    #=> "h3ll*"

Если вы хотите предоставить несколько хешей, вы можете обойти их, создав хеш, где пары ключ / значение являются парами поиска =>, переберите хеш и передайте их в gsub. Поскольку Ruby 1.9+ поддерживает порядок вставки хэша, вы гарантированно будете выполнять поиск в нужном вам порядке.

search_hash = {
  '1' => 'one', 
  'too' => 'two', 
  /[\t ]+/ => ' '
}
str = "1, too,\t3 ,    four"
search_hash.each { |n,v| str.gsub!(n, v) }
str #=> "one, two, 3 , four"
0 голосов
/ 16 марта 2011

Если вы просто хотите, чтобы пробелы / табуляции заменялись одним пробелом, почему бы просто не указать это в качестве замены и не пропустить весь хэш?

gsub(/[ \t]+/, ' ')

ОБНОВЛЕНИЕ: на основе вашего комментария вы можете использоватьсинтаксис блока gsub

gsub(/[ \t]+/) {|match| *do stuff here* }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...