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

假设我有以下字符串:

mystring =“start / abc123 / end”

你怎么能用其他东西abc123 ,同时保留“/ start /”和“/ end”元素完好无损?

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

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

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

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

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

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

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

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

或者,您可以捕获要保留的字符串片段并在替换项周围插入它们,这比前瞻/后观更可读:

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

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

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

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

或者,只需匹配数字:

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

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

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