我正在编写一种简单的方法来检测和删除文本字符串中的标记。给定此输入字符串:
{{foobar}}
该功能必须返回
foobar
我以为我可以链接多个chomp!
方法,如下所示:
"{{foobar}}".chomp!("{{").chomp!("}}")
但这不起作用,因为第一个chomp!
会返回NilClass
。我可以使用常规chomp
语句来完成它,但我真的在寻找一个单行解决方案。
String class documentation表示chomp!
如果已进行修改则返回Str
- 因此,第二个chomp!
应该有效。但是,它没有。我对这里发生的事情感到茫然。
出于这个问题的目的,您可以假设输入字符串始终是以双花括号开头和结尾的标记。
答案 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('}}', '')
您也可以使用gsub
或sub
,但如果不需要替换为模式,那么tr
应该更快。
如果总是有大括号,那么你可以只切片:
'{{foobar}}'[2...-2]
如果您打算创建一个返回没有花括号的字符串的方法,那么请勿使用bang版本。修改方法的输入参数将是惊人的!
def strip(string)
string.tr!('{{', '').tr!('}}', '')
end
a = '{{foobar}}'
b = strip(a)
puts b #=> foobar
puts a #=> foobar