首先,您需要注意gsub
和gsub!
。后者是“危险的!”并将修改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
现货。谢谢! – 2012-02-02 16:08:09