2008-11-13 113 views
65

我認爲這段代碼可以工作,但正則表達式並不匹配\ r \ n。我在一個十六進制編輯器中查看了我正在讀取的數據,並驗證文件中確實存在十六進制D和十六進制A模式。如何使用Ruby刪除回車?

我也嘗試過正則表達式/ \ xD \ xA/m和/ \ x0D \ x0A/m,但它們也不匹配。

這是現在我的代碼:

lines2 = lines.gsub(/\r\n/m, "\n") 
    if (lines == lines2) 
     print "still the same\n" 
    else 
     print "made the change\n" 
    end 

除了替代品,它會很高興地知道我做錯了什麼(便於對我而言有些學習)。 :)

回答

23

當你做什麼時puts lines?這會給你一個線索。

默認File.open以文本模式打開文件,因此您的\r\n字符將自動轉換爲\n。也許這就是lines總是等於lines2的原因。爲了防止紅寶石從解析線端使用rb模式:

C:\> copy con lala.txt 
a 
file 
with 
many 
lines 
^Z 

C:\> irb 
irb(main):001:0> text = File.open('lala.txt').read 
=> "a\nfile\nwith\nmany\nlines\n" 
irb(main):002:0> bin = File.open('lala.txt', 'rb').read 
=> "a\r\nfile\r\nwith\r\nmany\r\nlines\r\n" 
irb(main):003:0> 

但是從你的問題,我的代碼看,你只需要打開與默認修改該文件。您不需要任何轉換,可以使用較短的File.read

+2

有更多upvotes的答案更適合朝着「Strip換行」進一步下行:http://stackoverflow.com/a/7095275/403234 – yas4891 2013-04-15 17:56:00

15
lines2 = lines.split.join("\n") 
+4

這也將去掉標籤和空白,這可能不是用戶想要什麼。 – Doug 2012-04-01 16:14:40

6

以下情況如何?

irb(main):003:0> my_string = "Some text with a carriage return \r" 
=> "Some text with a carriage return \r" 
irb(main):004:0> my_string.gsub(/\r/,"") 
=> "Some text with a carriage return " 
irb(main):005:0> 

或者......

irb(main):007:0> my_string = "Some text with a carriage return \r\n" 
=> "Some text with a carriage return \r\n" 
irb(main):008:0> my_string.gsub(/\r\n/,"\n") 
=> "Some text with a carriage return \n" 
irb(main):009:0> 
+0

也,我檢查:「\ r \ n」!=「\ n」。所以它看起來像原來的海報代碼是正確的。 – rampion 2008-11-13 18:53:57

33

通常,當我處理剝離\ R或\ N,我會尋找雙方通過執行類似

lines.gsub(/\r\n?/, "\n"); 

我已經發現,根據數據的保存方式(使用的操作系統,使用的編輯器,當時木星與Io的關係),回車後可能有也可能不是新行。這看起來很奇怪,你看到兩個字符在十六進制模式。希望這可以幫助。

149

使用String#strip

返回海峽的副本開頭和結尾的空格去掉。

e.g

" hello ".strip #=> "hello" 
"\tgoodbye\r\n".strip #=> "goodbye" 

使用GSUB

string = string.gsub(/\r/," ") 
string = string.gsub(/\n/," ") 
+5

它不會在文本中間過濾換行符: 「line1 \ n line2 「.strip#=>」line1 \ n line2「 – ndrix 2012-05-20 12:09:46

+0

如果在`each_line`調用中使用,那麼這沒關係。 – 2012-05-20 12:26:10

+5

刪除所有周圍的空格!=刪除回車 – 2013-09-26 09:49:58

2

爲什麼不讀在文本模式下的文件,而不是二進制模式?

17
modified_string = string.gsub(/\s+/, ' ').strip 
+0

非常感謝!它節省了我的一天! – Rubyrider 2013-05-21 18:16:58

1

您可以使用此:

my_string.strip.gsub(/\s+/, ' ') 
12

如果您使用Rails,有squish方法

"\tgoodbye\r\n".squish => "goodbye"

"\tgood \t\r\nbye\r\n".squish => "good bye"

0

我覺得你的正則表達式是幾乎完整的 - 這裏就是我會做:

lines2 = lines.gsub(/[\r\n]+/m, "\n") 

在上面,我已經把\ r和\ n成爲一個類(這種方式,它們可能出現的順序無關緊要)並添加了「+」限定詞(因此「\ r \ n \ r \ n \ r \ n」也會匹配一次,而整個東西換成「\ n」)

0

只是另一種變體:

lines.delete(" \n")