假设我有以下字符串:
mystring = "开始/abc123/结束"
你怎么能用abc123
其他东西拼接出来,同时保持“/start/”和“/end”元素完好无损?
我有以下匹配模式,但它替换了整个字符串。我希望将其替换abc123
为123abc
.
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
指的是正则表达式中的编号捕获。
问题是您将整个匹配的字符串 , 替换为"start/8/end"
“7”。您需要包含要保留的匹配字符:
mystring.gsub(/start\/(.*)\/end/, "start/7/end")
或者,只需匹配数字:
mystring.gsub(/\d+/, "7")
您可以通过将正则表达式中的开始和结束元素分组,然后在替换字符串中引用这些组来做到这一点:
mystring.gsub(/(?<start>start\/).*(?<end>\/end)/, "\\<start>7\\<end>")