使用Ruby去除特殊字符,但不包括空格

8

我在这里搜索了一段时间,但并没有找到我需要的内容。我正在学习Ruby(1.9)并尝试使用文本文件完成一些基本操作。我试图使用正则表达式删除非字母和仅位于行首的空格,忽略标记之间的空格(我正在尝试计算文件中的单词数,因此需要保留单词之间的空格)。

例如:

555 r6ub6y i7s e7a0sy... w1o2w4.

转变为:

ruby is easy... wow.

我目前使用命令行测试ruby rubyfile.rb < test.txt,以下是我的进展:

$stdin.each do |line|
    line.chomp!.downcase!
    line.gsub!(/[^a-zA-Z]/, "") #this takes away my spaces!
    puts line
end

请注意,如果没有进行任何更改,chomp!将返回nil。这是一种有些出乎意料的行为。 - JKillian
在这种情况下,“unexpected”或“undesirable”是不期望的。字符串的感叹号(!)方法通常在未应用更改时返回nil。感叹号意味着它的同名方法更危险,有时会改变接收器或以某种方式产生与非感叹号方法不同的结果。我认为感叹号意味着危险,期望有所不同。 - engineersmnky
@engineersmnky 嗯,我熟悉感叹号方法,并且你绝对正确,许多字符串的行为类似于 chomp。只是个人认为通常情况下它们不能像常规版本一样链接在一起有点奇怪... - JKillian
2个回答

12
[^a-zA-Z. ]

同时加上一个空格。


1
text.each_line { |l| puts l.downcase.gsub(/[^a-zA-Z ]/,'').strip }。 - Cary Swoveland
1
实际上你不需要 A-Z 部分,因为你已经将它转换为小写了。 - Mark Thomas
1
@MarkThomas 刚刚使用了原帖中的正则表达式。 - vks
一个重要的细节是使用 strip 而不是 chomp,因为它可以同时删除前导空格。 - Mark Thomas
1
@vks,仅仅更新正则表达式并不是一个完整的答案,正如Cary和我所指出的那样。 - Mark Thomas
没有人提到这也会删除句号,这不是预期的结果。 - engineersmnky

5

由于您目前仅指定了数字的删除,因此这将作为单行工作。

"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/\d/,'').strip 
#=>"ruby is easy... wow."

这基本上意味着删除所有数字和前导/尾随空格。

目前您的正则表达式表示删除除大写和小写字母外的所有内容。不确定您想要删除哪些其他类型的字符,但如果您只想要大写/小写字母、空格和句号,那么类似这样的内容也可以为您工作。

"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/[^a-zA-Z\s.]/,'').strip 
#=>"ruby is easy... wow."

同样,在正则表达式中包含空格时,我总是倾向于使用 \s 而不是隐含的空格符 [ ] ,因为我觉得它能增加可读性,如[a-zA-Z ] 可能是笔误,不应该包括空格,但 [a-zA-Z\s] 明确表示我需要空格。

想了解更多关于正则表达式的知识,请查看Rubular,它是用于 Ruby 的正则表达式评估器,我经常使用它。它唯一没有详细介绍的是贪婪和非贪婪捕获组,但我感觉你现在不必担心这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接