我希望'这是一个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. => ""
答案 0 :(得分:27)
首先,您需要注意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中尝试它,它将表现为你需要另一个/
。
E方法替换所有非单词字符和所有数字:
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
答案 1 :(得分:8)
要删除所有“非单词字符”,您只能保留这些字符。
src = 'This Is A 101 Test'
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ')
=> "This Is A Test"
我建议使用Rubular来试用Ruby正则表达式。
答案 2 :(得分:7)
没有正则表达式:
src = 'This Is A 101 Test'
src.delete('^a-zA-Z ') #the ^ negates everything
答案 3 :(得分:4)
你想从字符串中剪切'101'吗?这是你的正则表达式
src = 'This Is A 101 Test'
puts src.gsub /\ \d+/, ''
# => This Is A Test
另外,我不明白你为什么使用gsub
的爆炸版。 gsub!
修改原始字符串,gsub
复制它并修改副本。
答案 4 :(得分:3)
您只想删除号码吗?如果是这样,src.gsub(/\d/,"")
应该有效。它不起作用的原因是gsub!修改它被调用的字符串,所以在C之后,src =“101”并且消除所有数字会留下一个空字符串。
如果你想删除除字母字符和空格(即数字和标点符号)之外的所有内容,src.gsub(/(?=\S)(\d|\W)/,"")
应该有用。
如果你想删除除字母字符之外的所有内容(删除空格以及数字和标点符号),src.gsub(/\d|\W/,"")
应该有用。