多个Ruby chomp!声明

时间:2016-06-26 18:30:52

标签: ruby

我正在编写一种简单的方法来检测和删除文本字符串中的标记。给定此输入字符串:

{{foobar}}

该功能必须返回

foobar

我以为我可以链接多个chomp!方法,如下所示:

"{{foobar}}".chomp!("{{").chomp!("}}")

但这不起作用,因为第一个chomp!会返回NilClass。我可以使用常规chomp语句来完成它,但我真的在寻找一个单行解决方案。

String class documentation表示chomp!如果已进行修改则返回Str - 因此,第二个chomp!应该有效。但是,它没有。我对这里发生的事情感到茫然。

出于这个问题的目的,您可以假设输入字符串始终是以双花括号开头和结尾的标记。

3 个答案:

答案 0 :(得分:2)

你绝对可以链接多个chomp语句(非爆炸版本),仍然可以根据需要使用单行解决方案:

 "{{foobar}}".chomp("{{").chomp("}}")

但是,它不会按预期工作,因为chomp!chomp仅从字符串的末尾删除分隔符,而不是从开头删除。

您可以使用sub

"{{foobar}}".sub(/{{(.+)}}/, '\1')
# => "foobar"

"alfa {{foobar}} beta".sub(/{{(.+)}}/, '\1')
# => "alfa foobar beta"

# more restrictive
"{{foobar}}".sub(/^{{(.+)}}$/, '\1')
# => "foobar"

答案 1 :(得分:0)

测试一下,很明显chomp!如果作为参数提供的分隔符不在字符串的末尾,则返回nil。

因此"{{text}}".chomp!("}}")会返回一个字符串,但"{{text}}".chomp!("{{")会重新生成nil。

有关如何在字符串开头chomp的答案,请参阅here。但要认识到chomp只查看字符串的结尾。因此,您可以call str.reverse.chomp!("{{").reverse删除左括号。

你也可以使用正则表达式:

string = "{{text}}"
puts [/^\{\{(.+)\}\}$/, 1]
# => "text"

答案 2 :(得分:0)

尝试tr

'{{foobar}}'.tr('{{', '').tr('}}', '')

您也可以使用gsubsub,但如果不需要替换为模式,那么tr应该更快。

如果总是有大括号,那么你可以只切片:

'{{foobar}}'[2...-2]

如果您打算创建一个返回没有花括号的字符串的方法,那么请勿使用bang版本。修改方法的输入参数将是惊人的!

def strip(string)
  string.tr!('{{', '').tr!('}}', '')
end
a = '{{foobar}}'
b = strip(a)
puts b #=> foobar
puts a #=> foobar