如何从Ruby字符串中删除"\n"字符串?

142

我有一个字符串:

"some text\nandsomemore"
我需要将"\n"从中删除。我尝试过。
"some text\nandsomemore".gsub('\n','')

但它不起作用。我该怎么做?谢谢阅读。

6个回答

204

你需要在gsub中使用"\n"而不是'\n'。这两个引号有不同的功能。

双引号"允许字符展开和表达式插值,也就是说,它们可以让你使用转义控制字符如\n来表示它们真正的值,此处为换行符,并且允许使用#{expression},因此你可以将变量和任何Ruby表达式嵌入到文本中。

另一方面,单引号'将字符串视为字面量,所以没有扩展、替换、插值或其他任何操作。

在这种特殊情况下,最好使用.delete.tr字符串方法删除换行符

更多信息请参见这里


21
正确的语法应该是.gsub(/\n/, ""),意思是替换掉所有换行符。 - boulder_ruby
2
@David是正确的。然而,我认为展示引号的区别很重要,因为这会对Ben有所帮助。当然,David,这可能更多是风格问题而不是“正确性”问题。个人认为tr是这个任务的更好选择,但正如我所说,我认为在回答时指出单引号和双引号的区别更好。 - ocodo
为什么使用.delete.tr更好? - Juan José Ramírez
2
它们比.gsub更快,因为它们执行的操作更少(.delete很可能是最快的,尽管进行性能分析可以百分之百确认这一点)。 - ocodo

86
如果您想要或者不介意从字符串中删除所有前导和尾随的空格,您可以使用 strip 方法。
"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

此处所述。

编辑此问题的原标题与现在不同。我的回答是针对原问题的。


7
这并没有回答问题。strip只能够移除字符串开头和结尾的空白字符:http://ruby-doc.org/core-1.9.3/String.html#method-i-strip-21 - myconode
1
@mvdanj 是的,考虑到这个问题的具体细节,它并不能回答问题,但是仅基于标题,它确实回答了问题。我猜这就是人们发现它有用的原因。 - ThomasW
标题已经从我最初回答的时候改变了。 - ThomasW

65

如果你想要删除一个字符串,而不是替换它,可以使用String#delete(或其变异方法String#delete!),例如:

x = "foo\nfoo"
x.delete!("\n")

x 现在的值为 "foofoo"

在这种情况下,String#deletegsub 更易读,因为你实际上并没有替换字符串。


3
至少在 Ruby 1.9.3 中,delete 方法并不具有破坏性,与此处所示不同。它会返回一个新的字符串。 - Brent Dillingham
很好的发现。我已经更新了那段代码片段,使用了变异器版本的String#delete!而不是String#delete。 - Paul Leader

32
您不需要使用正则表达式来实现这个功能。可以使用 tr:
"some text\nandsomemore".tr("\n","")

1
tr 和 replace 之间有什么区别? - Arnold Roa
replace 只是将字符串更改为新的字符串,就像变量赋值一样;而 tr 是逐个字符进行全局查找和替换。 - Mark Thomas
和gsub有什么区别? - Matrix

20

使用Ruby的chompstrip函数:

"abcd\n".chomp => "abcd"
"abcd\n".strip => "abcd"

6
这并没有回答问题。strip 只会移除字符串开头和结尾的空格 - http://ruby-doc.org/core-1.9.3/String.html#method-i-strip-21 - myconode
3
在 chomp 方法中,如果 \n 和 \r 存在于 str 的末尾,则会将其删除,而不是在中间删除。因此,这并不能解决 OP 的问题。 - silva96

0
出于某种原因,这些答案都不适用于我的情况,我找到了自己的解决方案:
"some text\nandsomemore".split.join

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