如何替换一系列二进制字符

时间:2017-01-10 19:47:12

标签: ruby regex binary range

如何替换一系列二进制字符,类似于在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。

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中使用trtr为此目的更快。

答案 3 :(得分:0)

试一试:

string = "\xA0"
string.gsub( /[\x00-\xFF]/, '' )
=> " "

这涵盖了0x00(0十进制)和0xFF(十进制255)之间的ASCII字符范围。