1

假设我有以下字符串:

mystring = "开始/abc123/结束"

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

我有以下匹配模式,但它替换了整个字符串。我希望将其替换abc123123abc.

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

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

4

5 回答 5

4

你可以使用这个字符类来做到这一点:([^\/]不是斜线)和环视

mystring.gsub(/(?<=start\/)[^\/]+(?=\/end)/,"7")
于 2013-06-14T20:44:05.107 回答
3

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

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

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

于 2013-06-14T20:44:29.967 回答
1

或者,您可以捕获要保留的字符串片段并将它们插入替换周围,结果证明这前瞻/后视更具可读性:

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

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

于 2013-06-14T20:54:20.483 回答
0

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

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

或者,只需匹配数字:

mystring.gsub(/\d+/, "7")
于 2013-06-14T20:46:38.823 回答
0

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

mystring.gsub(/(?<start>start\/).*(?<end>\/end)/, "\\<start>7\\<end>")
于 2013-06-14T20:59:36.577 回答