假设我有以下字符串:
mystring =“start / abc123 / end”
如何将abc123
与其他东西拼接出来,同时保留“/ start /”和“/ end”元素不变?
我有以下匹配模式,但它取代了整个字符串。我希望将abc123
替换为123abc
。
mystring.gsub(/start\/(.*)\/end/,"123abc") #=> "123abc"
修改:开头和之间的字符结束元素可以是字母数字字符的任意组合,我改变了我的例子以反映这一点。
答案 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>")