2017-01-10 22 views
0

如何替換一系列二進制字符,類似於正則表達式中的一系列常規字符("[a-z]")?我想這樣的:如何替換一系列二進制字符

2.4.0 :016 > text.gsub([160.chr-194.chr], ' ') 
NoMethodError: undefined method `-' for "\xA0":String 
Did you mean? [email protected] 
    from (irb):16 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/[email protected]/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

歡迎來到Stack Overflow。請注意你的拼寫和語法。堆棧溢出不是一個討論列表,它是一個在線參考,這些事情很重要。如果你不這樣做,我們必須解決這些問題,這會浪費我們花時間幫助別人。 –

回答

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" 
+0

也許會問痛得很明顯,但爲了讓我的例子能夠正常工作,我在使用「(160..194)」。每個{| e | text.gsub!(e.chr,'')}「? – Dave

+0

是的,但試試我的第二個版本。我相信它更接近你原來的意圖(也許更有效);只需使用範圍的十六進制值 – JLB

+0

當我使用「td_text.gsub(/ [\ xA0- \ xC2] /,'')」嘗試第二個解決方案時,它會失敗,並顯示錯誤「invalid multibyte escape:/ [\ xA0- \ xC2]/「。第一個解決方案也失敗了,但是出現錯誤」Encoding :: CompatibilityError:不兼容的字符編碼:UTF-8和ASCII-8BIT「 – Dave

0

只需使用

str.tr("\xA0-\xC2", ' ') 

使用十六進制\x轉義序列。

或者如果charcodes不是靜態

charset = [160.chr,194.chr].join('-') 
str.tr(charset, ' ') 
+0

不幸的是,當我運行「td_text.tr(」\ xA0- \ xC2「,'')」時,出現錯誤「ArgumentError:UTF- 8" 。當我將有問題的字符串輸出到屏幕上時,它會佔用幾行,但包含可見文本「?PLACE」。 – Dave

+0

問題在於'\ xA0- \ xC2「和'[160.chr,194.chr] .join(' - ')產生8位ASCII,而Ruby現在默認爲UTF-8。如何告訴Ruby使用8位ASCII在互聯網和SO上的文檔和多個頁面中都有介紹。 –

+0

爲什麼downvote?請解釋一下,這樣我可以改進答案。 – akuhn

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]/, ' ') 
# => "         " 

所有這一切說,我d推薦使用tr,如akuhn's answertr爲此目的更快。

+0

不幸的是,如果我設置一個變量爲'text =「\ r \ n \ xA0PLACE \ r \ n」'然後運行「text.gsub(/ [\ u00A0- \ u00c2] /,'')」,錯誤「ArgumentError:UTF-8中的無效字節序列」。 – Dave

+0

您可能需要閱讀有關通知Ruby使用8位ASCII或將8位ASCII轉換爲UTF-8的信息。 –

0

給這個一杆:

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

這涵蓋的ASCII字符爲0x00(0十進制)之間的範圍內和爲0xFF(255十進制)。

相關問題