如何从文本中删除非单词字符?

Mic*_*ant 15 ruby regex

我希望'这是一个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

首先,你需要小心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"
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)


Jon*_*röm 8

要删除所有"非单词字符",您只能保留这些字符.

src = 'This Is A 101 Test'
src.gsub(/[^a-zA-Z ]/,'').gsub(/ +/,' ')
=> "This Is A Test"
Run Code Online (Sandbox Code Playgroud)

我推荐Rubular来试用Ruby正则表达式.


ste*_*lag 8

没有正则表达式:

src = 'This Is A 101 Test'
src.delete('^a-zA-Z ') #the ^ negates everything
Run Code Online (Sandbox Code Playgroud)