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

时间:2012-02-02 15:46:37

标签: 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. => ""

5 个答案:

答案 0 :(得分: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"

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/,"")应该有用。