我希望'这是一个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. => ""
Run Code Online (Sandbox Code Playgroud)
bry*_*mck 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"
Run Code Online (Sandbox Code Playgroud)
C方法删除所有不是数字的字符:
src.gsub!(/\D/, "") # => "101"
src # => "101"
Run Code Online (Sandbox Code Playgroud)
D方法不起作用,因为语法错误.该gsub方法接受正则表达式/字符串进行搜索,然后接受用于替换的字符串.如果你在IRB中尝试它,它将表现为你需要另一个/地方.
E方法替换所有非单词字符和所有数字:
src.gsub(/(\W|\d)/, "") # => "This Is A Test" (note the two spaces)
src # => "This Is A 101 Test"
Run Code Online (Sandbox Code Playgroud)
你指出它正在回归"".那么,实际发生的是列出的C和D(语法问题已修复)是破坏性的变化.(另外,如果继续运行"101",D将实际返回,nil因为没有执行替换.)因此,E正在运行"101",并且由于您将所有非单词和所有数字替换为"",所以它变为"101".
您正在寻找的答案将是:
src.gsub!(/\d\s?/, "") # => "This Is A Test"
src # => "This Is A Test"
Run Code Online (Sandbox Code Playgroud)
我最喜欢处理双空格的所有场景(因为squeeze在组合像字符strip方面非常有效,在剥离尾随空格时非常有效,如果它们没有替换则会!返回nil):
src = src.gsub(/\d+/, "").squeeze(" ").strip
Run Code Online (Sandbox Code Playgroud)
要删除所有"非单词字符",您只能保留这些字符.
src = 'This Is A 101 Test'
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ')
=> "This Is A Test"
Run Code Online (Sandbox Code Playgroud)
我推荐Rubular来试用Ruby正则表达式.
没有正则表达式:
src = 'This Is A 101 Test'
src.delete('^a-zA-Z ') #the ^ negates everything
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21069 次 |
| 最近记录: |