String gsub - 替换两个元素之间的字符,但保留周围的元素

时间:2013-06-14 20:41:11

标签: ruby regex

假设我有以下字符串:

  

mystring =“start / abc123 / end”

如何将abc123与其他东西拼接出来,同时保留“/ start /”和“/ end”元素不变?

我有以下匹配模式,但它取代了整个字符串。我希望将abc123替换为123abc

mystring.gsub(/start\/(.*)\/end/,"123abc")  #=> "123abc" 

修改:开头和之间的字符结束元素可以是字母数字字符的任意组合,我改变了我的例子以反映这一点。

5 个答案:

答案 0 :(得分:4)

您可以使用此字符类执行此操作:[^\/](所有不是斜杠)和lookarounds

mystring.gsub(/(?<=start\/)[^\/]+(?=\/end)/,"7")

答案 1 :(得分:2)

对于您的示例,您可以使用:

mystring.gsub(/\/(.*?)\//,"/7/")

这将匹配您要替换的字符串之间的两个斜杠,并将它们放回替换中。

答案 2 :(得分:1)

或者,您可以捕获要保留的字符串片段并在替换片段周围插入它们,结果显示很多比lookaheads / lookbehinds更具可读性:

irb(main):010:0> mystring.gsub(/(start)\/.*\/(end)/, "\\1/7/\\2")
=> "start/7/end"

\\1\\2在这里指的是正则表达式中的编号捕获。

答案 3 :(得分:0)

问题在于您将整个匹配的字符串"start/8/end"替换为“7”。您需要包含要保留的匹配字符:

mystring.gsub(/start\/(.*)\/end/, "start/7/end")

或者,只需匹配数字:

mystring.gsub(/\d+/, "7")

答案 4 :(得分:0)

您可以通过将正则表达式中的开始和结束元素分组,然后在替换字符串中引用这些组来实现此目的:

mystring.gsub(/(?<start>start\/).*(?<end>\/end)/, "\\<start>7\\<end>")