![](/img/trans.png)
[英]undefined method `gsub' for nil:NilClass or how to use gsub method in rails
[英]How to use gsub twice?
我需要执行搜索和替换活动
我建立的方法是
def fill_in(template)
template.gsub(/\"\{\{(.*?)\}\}\"/) do
"test"
end
end
试过template.gsub(/\"\{\{(.*?)\}\}\"/).gsub(/\{\{(.*?)\}\}/) do
,但这给了我错误
#<Enumerator: "{{user_name}}":gsub(/"{{(.*?)}}"/)> 的未定义方法 `gsub'
如果第一个 gsub 与该模式匹配则优先,如果不匹配则检查第二个 gsub
template.gsub(/\"\{\{(.*?)\}\}\"/) do
# content will be replaced from the data object
end.gsub(/\"\{\{(.*?)\}\}\"/) do
# content will be replaced from the data object
end
两个 gsub 的 do body 是相同的,如何停止这种重复
gsub
仅将正则表达式作为返回Enumerator的单个参数,因此您无法以这种方式链接gsub
。
您可以将两种模式合二为一:
/(")?\{\{(.*?)\}\}(?(1)"|)/
请参阅正则表达式演示。 细节:
(")?
- 捕获第 1 组(可选):\{\{
- {{
文本(.*?)
- 捕获第 2 组:除换行符以外的任何零个或多个字符,尽可能少(如果您也需要匹配换行符,请改用((?s:.*?))
,或者只需添加/m
标志)\}\}
- }}
字符串(?(1)"|)
- 条件构造:如果第 1 组匹配,则匹配"
,否则匹配空字符串。在代码中,您需要检查第 1 组是否匹配,如果匹配,则执行一个替换逻辑,否则,使用另一个替换逻辑。 请参阅Ruby 演示:
def fill_in(template)
template.gsub(/(")?\{\{(.*?)\}\}(?(1)"|)/) {
$~[1] ? "Replacement 1" : "Replacement 2"
}
end
p fill_in('"{{hello}}" and {{hello}}')
# => "Replacement 1 and Replacement 2"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.