如何替换一系列二进制字符,类似于在regexp中使用一系列常规字符("[a-z]"
)?我正在尝试这个:
2.4.0 :016 > text.gsub([160.chr-194.chr], ' ')
NoMethodError: undefined method `-' for "\xA0":String
Did you mean? -@
from (irb):16
from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start'
from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start'
from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
但是我得到了
NoMethodError: undefined method `-' for "\xA0":String
你在上面看到错误。
我不必使用正则表达式,但却无法想到任何其他允许我替换各种事物的东西。
我正在使用Ruby 2.4。
答案 0 :(得分:0)
假设你想用空格代替ASCII值97到127之间的字符:
irb(main):002:0> text = 'TeStInG'
=> "TeStInG"
irb(main):003:0> (97..127).each { |e| text.gsub!(e.chr,' ') }
=> 97..127
irb(main):004:0> text
=> "T S I G"
或者,您可以尝试这样的事情:
irb(main):024:0> text.gsub(/[\x00-\x20]/, 'Z')
=> "TZSZIZG"
答案 1 :(得分:0)
只需使用
str.tr("\xA0-\xC2", ' ')
使用十六进制\x
转义序列。
或者如果charcodes不是静态的
charset = [160.chr,194.chr].join('-')
str.tr(charset, ' ')
答案 2 :(得分:0)
默想:
160.to_s(16) # => "a0"
194.to_s(16) # => "c2"
"a0"
和"c2"
分别是160和194的十六进制表示。通常我们使用十六进制版本,因为小数会导致混淆。
您可以使用"\xa0"
或"\u00a0"
,具体取决于您使用的是8位ASCII,还是UTF-8或Unicode。当前红宝石默认为UTF-8。
这是一个由要测试的字符范围组成的字符串:
text = ("\u00a0" .. "\u00c2").to_a.map(&:chr).join
# => " ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂ"
这是告诉Ruby如何修改该范围内的所有字符:
text.gsub(/[\u00A0-\u00c2]/, ' ')
# => " "
所有这一切,我建议在akuhn's answer中使用tr
。 tr
为此目的更快。
答案 3 :(得分:0)
试一试:
string = "\xA0"
string.gsub( /[\x00-\xFF]/, '' )
=> " "
这涵盖了0x00(0十进制)和0xFF(十进制255)之间的ASCII字符范围。