2012-02-02 96 views
14

我想'這是一個101測試'是'這是一個測試',但我不能得到正確的語法。如何從文本中刪除非單詞字符?

src = 'This Is A 101 Test' 
puts "A) " + src      # base => "This Is A 101 Test" 
puts "B) " + src[/([a-z]+)/]   # only does first word => "his" 
puts "C) " + src.gsub!(/\D/, "")  # Does digits, I want alphabetic => "101" 
puts "D) " + src.gsub!(/\W///g)  # Nothing. => "" 
puts "E) " + src.gsub(/(\W|\d)/, "") # Nothing. => "" 

回答

27

首先,您需要注意gsubgsub!。後者是「危險的!」並將修改src的值。如果您按順序執行這些語句,請注意a.gsub!(/a/, "b")a = a.gsub(/a/, "b")都會對a執行相同的操作。代碼的一部分問題是src正在被修改。

在B方法返回"his",但不更改source

src[/([a-z]+)/]  # => "his" 
src     # => "This Is A 101 Test" 

的C法去除了數字的所有字符:

src.gsub!(/\D/, "") # => "101" 
src     # => "101" 

的d方法不起作用因爲語法是錯誤的。 gsub方法接受正則表達式/字符串進行搜索,然後接受用於替換的字符串。如果你在IRB中嘗試它,它會表現得好像你需要另一個/

電子方法代替所有非單詞字符和所有數字:

src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces) 
src      # => "This Is A 101 Test" 

您指出的是,它的返回""。那麼,實際發生的事情是,C和D列出(與語法問題解決)是破壞性更改。 (另外,如果在"101"運行,d實際上將返回nil作爲不可替代的進行。)所以E的只是被上"101"運行,因爲你與""替換所有非詞所有數字,它成爲"101"


你正在尋找的答案會是這樣的:

src.gsub!(/\d\s?/, "") # => "This Is A Test" 
src     # => "This Is A Test" 

而且我的雙空格所有情況的處理(因爲squeeze是相當有效率在合併同類角色的喜愛,strip是在去除尾隨空白相當有效率,而那些!回報nil,如果他們不作任何更換):

src = src.gsub(/\d+/, "").squeeze(" ").strip 
+0

現貨。謝謝! – 2012-02-02 16:08:09

4

你想從字符串中切下'101'嗎?這是你的正則表達式

src = 'This Is A 101 Test' 

puts src.gsub /\ \d+/, '' 
# => This Is A Test 

也是爲什麼你正在使用的gsub爆炸版本我不明白。 gsub!修改原始字符串,gsub複製它並修改副本。

+0

不工作:'把 「F)」 + src.gsub/\ d +/'' ^' – 2012-02-02 15:53:03

+2

@MichaelDurrant:它的工作原理。你的字符串不是你想象的那樣。將'gsub!'更改爲'gsub'並重試。 – 2012-02-02 15:55:11

+0

爲我工作。完全按照他的發佈。 '放入src.gsub(/ \ \ d + /,'')'。正如@SergioTulentsev所說,你不應該使用'gsub'方法的'bang'版本。 [閱讀爆炸文檔](http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub-21),它操縱原始字符串。 – Batkins 2012-02-02 15:57:14

3

你只是想刪除號碼嗎?如果是這樣,src.gsub(/\d/,"")應該工作。它不起作用的原因是gsub!修改它被調用的字符串,因此在C之後,src =「101」並且刪除所有數字會留下一個空字符串。

如果你想消除除字母和空格之外的任何字符(例如數字和標點符號),src.gsub(/(?=\S)(\d|\W)/,"")應該可以工作。

如果你想消除除字母字符(消除空格以及數字和標點符號)之外的所有東西,src.gsub(/\d|\W/,"")應該可以工作。

8

要刪除所有「非單詞字符」,你可以改爲只保留那些。

src = 'This Is A 101 Test' 
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ') 
=> "This Is A Test" 

我推薦Rubular來嘗試Ruby正則表達式。

+1

+1爲紅色,這真棒! – 2012-03-09 01:04:37

7

沒有正則表達式:

src = 'This Is A 101 Test' 
src.delete('^a-zA-Z ') #the^negates everything 
相關問題