ruby正则表达式替换字符串上的重复匹配

时间:2012-01-25 11:25:26

标签: ruby regex string

我需要在ruby中解析一个字符串,其中包含大量的id和名称,如{2,Shahar}

字符串是这样的:

text = "Hello {1,Micheal}, my name is {2,Shahar}, nice to meet you!"

当我尝试解析它时,正则表达式跳过第一个},我得到这样的结果:

text.gsub(/\{(.*),(.*)\}/, "\\2(\\1)")
=> "Hello Shahar(1,Micheal}, my name is {2), nice to meet you!"

所需的重播应该是:

=> "Hello Michael(1), my name is Shahar(2), nice to meet you!"

我会感谢任何可以提供帮助的人。

由于 沙哈尔

1 个答案:

答案 0 :(得分:1)

贪婪的.*匹配太多了。它表示“任何字符串,最大可能长度”。因此,第一个(.*)匹配1,Micheal}, my name is {2,然后逗号匹配逗号,第二个(.*)匹配Shahar(最终\}匹配结束括号。

更具体地说。例如,您可以将匹配限制为仅允许除大括号之外的字符,以确保匹配永远不会超出{...}部分的范围:

text.gsub(/\{([^{}]*),([^{}]*)\}/, "\\2(\\1)")

或者你可以这样做:

text.gsub(/\{([^,]*),([^}]*)\}/, "\\2(\\1)")

其中第一部分可以是任何不包含逗号的字符串,第二部分可以是任何不包含}的字符串。