2012-02-02 60 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