【问题标题】:Changing n-th occurrence with regex使用正则表达式更改第 n 次出现
【发布时间】:2014-06-18 16:46:03
【问题描述】:

参考这个 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.')`

编辑:由于“.”在正则表达式中表示“匹配任何内容”,请改用“;”(分号)。更困难的是,如果我们有这样的字符串怎么办:

"ax;;cyz;def;eghi;xyzw" 我们想替换第三部分(例如:cyz)

【问题讨论】:

  • 注:个人所有 3 个答案都是可以接受的,只是 SO 只允许 1 个可接受的答案 grumble读者请为最适合您的答案添加 +1。

标签: regex


【解决方案1】:

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

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

并替换为:

\1NN.\3

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

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

Demo

您的评论:

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

Demo2

【讨论】:

  • 如果我有像%23;B;ccc;123;efgh; 这样的随机字符,那么 \w{2} 匹配将失败。不过,固定 2 个字母字符的良好解决方案。
  • @AlvinK.,我已经更新了你的第二个案例的答案。如果有帮助,你介意接受吗?谢谢。
  • sshashank124: Demo2 是正确的,但是@Ulugbek 首先发布了他的代码,因此我给了他学分。注意:Demo2 正则表达式使用“重复捕获组”,因为它省略了“?:”
  • @AlvinK.,实际上我在 3 小时前发布了我的答案,并在 2 小时前发布了 demo2。他在 1 小时前发布了答案。
  • sshashank124:Demo2 不会解析像“ax;;cyz;def;eghi;xyzw”这样的空字段,但可以通过将“+”更改为“*”来修复。
【解决方案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

【讨论】:

  • 如果您将{3} 更改为{4},它匹配'bb'。因此,如果分隔符“;”,这是一个理想的解决方案是固定的,因为它是倒数的。
【解决方案3】:

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

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

Demo

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多