用正则表达式改变第n次出现

时间:2014-05-02 04:21:17

标签: regex

参考这个SO问题:Cutting a string at nth occurrence of a character

有一个稍微不同的问题:这可以使用正则表达式完成吗?

"aa.bb.cc.dd.ee.xx" => "aa.bb.NN.dd.ee.ff" 
(replacing only 3rd occurrence, all chars are random alphanumeric text )

注意: .split()。slice()。join()是一个可读的解决方案,正则表达式似乎可行且简单明了(我可能错了)。例如:替换前两个" aa。"和" bb。"说' AoA'和BoB'似乎微不足道: -

`"aa.bb.cc.dd.ee.xx".replace(/([^\.]*\.){2}/, 'AoA.BoB.')`

修改,因为" "意味着匹配任何东西'在正则表达式中,请使用" ; " (分号)代替。为了使它更难,如果我们有这样的字符串怎么办:

"斧;; CYZ; DEF; eghi; XYZW"我们想要替换第3部分(例如:cyz)

3 个答案:

答案 0 :(得分:3)

要替换第三次出现,您将匹配:

^((\w{2}\.){2})\w{2}\.(.*)$

并替换为:

\ 1NN。\ 3

要替换第n次出现,您将匹配:

^((\w{2}\.){n-1})\w{2}\.(.*)$

Demo

征求意见:

^(([^;]*\;){2})[^;]*\;(.*)$

Demo2

答案 1 :(得分:2)

对于此特定字符串实例,您还可以使用以下内容。

[^.]*(?=(?:\.[^.]*){3}$)

正则表达式

[^.]*           any character except: '.' (0 or more times)
(?=             look ahead to see if there is:
 (?:            group, but do not capture (3 times):
 \.             '.'
  [^.]*         any character except: '.' (0 or more times)
){3}            end of grouping
 $              before an optional \n, and the end of the string
)               end of look-ahead

请参阅Live demo

答案 2 :(得分:2)

您可以使用以下正则表达式并将其替换为$1Hello$3n-1 => 2

^((?:[^;]*;){2})([^;]*)(.*)$

Regular expression visualization

Demo