我希望'这是一个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 次 |
最近记录: |