Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将字符串中的最后一个逗号替换为'&';-红宝石_Ruby On Rails_Ruby_String_Replace - Fatal编程技术网

Ruby on rails 将字符串中的最后一个逗号替换为'&';-红宝石

Ruby on rails 将字符串中的最后一个逗号替换为'&';-红宝石,ruby-on-rails,ruby,string,replace,Ruby On Rails,Ruby,String,Replace,我试图将任何给定字符串中的最后一个逗号(,“)替换为”&“ 我不想使用任何正则表达式 我是否可以使用某种方法来满足以下psuedo代码: find last x in string replace last x with y 也许: string = string.rpartition("&").map do |x| if x == "&" "," else x end end.join("") 有效吗?也许: s

我试图将任何给定字符串中的最后一个逗号(
,“
)替换为
”&“

我不想使用任何正则表达式

我是否可以使用某种方法来满足以下psuedo代码:

find last x in string
replace last x with y   
也许:

string = string.rpartition("&").map do |x|
    if x == "&"
        ","
    else
        x
    end
end.join("")
有效吗?

也许:

string = string.rpartition("&").map do |x|
    if x == "&"
        ","
    else
        x
    end
end.join("")

有效吗?

使用
sub
方法只替换第一次出现的代码,因此您可以
reverse
sub
reverse


“Ruby on Rails,Ruby,String,Replace”。reverse.sub(',','&')。reverse
sub方法只替换第一次出现的,因此您可以再次
reverse
sub
reverse

“Ruby on Rails,Ruby,String,Replace”。reverse.sub(',','&')。reverse
一次性解决方案:

>> "Lions, tigers, bears".tap{|s| s[s.rindex(', '), 2] = ' & '}
=> "Lions, tigers & bears"
  • 点击
    为其块内的字符串文本指定一个变量名。如果字符串已指定名称,则无需执行此操作
  • rindex
    在其调用的字符串中查找其参数的最后一次出现
  • s[idx,len]=str
    str
一次性解决方案:

>> "Lions, tigers, bears".tap{|s| s[s.rindex(', '), 2] = ' & '}
=> "Lions, tigers & bears"
  • 点击
    为其块内的字符串文本指定一个变量名。如果字符串已指定名称,则无需执行此操作
  • rindex
    在其调用的字符串中查找其参数的最后一次出现
  • s[idx,len]=str
    str

您可以使用捕获最后一个逗号周围的组来完成此操作:

>> "one, two, three, four".gsub(/(.*),(.*)/, '\1 &\2')
=> "one, two, three & four"
这些组将围绕最后一个
进行匹配,因为第一个捕获组(第一个
(.*)
)是贪婪的<代码>*将匹配尽可能多的文本,这意味着它将匹配到最后一个
,然后第二个捕获组
(.*)
将匹配剩下的内容


替换字符串(
'\1&\2'
)然后将捕获组文本放置在
&

的周围。您可以使用捕获组在最后一个逗号周围执行此操作:

>> "one, two, three, four".gsub(/(.*),(.*)/, '\1 &\2')
=> "one, two, three & four"
这些组将围绕最后一个
进行匹配,因为第一个捕获组(第一个
(.*)
)是贪婪的<代码>*将匹配尽可能多的文本,这意味着它将匹配到最后一个
,然后第二个捕获组
(.*)
将匹配剩下的内容


替换字符串(
'\1&\2'
)然后将捕获组文本放置在
&

周围,我认为
gsub
会替换所有出现的内容。但是,我只想替换最后一次出现的情况我想
gsub
会替换所有出现的情况。但是,我只想替换上一个例子为什么要避免regexp?您没有向我们展示您的尝试….?regex解决方案是
“看不见恶,听不见恶,说不出恶。”.sub(/.*\K,\s/,'&')#=>“看不见恶,听不见恶,说不出恶。”
为什么要避免regexp?您没有向我们展示您的尝试….?regex解决方案是
“看不见恶,听不见恶,说不出恶。”.sub(/.*\K\s/,'&')#=>“看不见恶,听不见恶,说不出恶。”
同样的想法,但您的速度更快了一点…;-)@我很乐意帮忙。如果它对你有用,请你接受它好吗?@mtaff你知道这个解决方案仍然使用正则表达式。根据定义,sub查找一个模式(读取正则表达式),然后替换该模式。所以按照你自己的说法,这是不可接受的solution@grail我认为反对regex是因为它的可读性差。@SekalfNroc我根本不是在挑你的解决方案:)只是提醒OP他要求一个非regex的解决方案相同的想法,但你快了一点…;-)@我很乐意帮忙。如果它对你有用,请你接受它好吗?@mtaff你知道这个解决方案仍然使用正则表达式。根据定义,sub查找一个模式(读取正则表达式),然后替换该模式。所以按照你自己的说法,这是不可接受的solution@grail我认为反对regex是因为它的可读性差。@SekalfNroc我根本不是在挑你的解决方案:)只是提醒OP他要求一个非regex的解决方案