使用正则表达式查找并替换字符串中的可变数量的项目

时间:2017-03-15 18:18:50

标签: regex string notepad++

我有几个字符串,如下所示:

sum({foo, c[0663, 0667, 0673, 0677, 0693, 0697, 0703, 0707]})
sum({foo, c[0663, 0667, 0673, 0677, 0693]})
sum({foo, c[0697, 0703, 0707]})
sum({foo, c[0693, 0697, 0703, 0707]})

我可以使用这个正则表达式找到所有这些:

sum\(\{foo, c\[(?:(\d{4})(, )?)+\]\}\)

当我需要替换包含4位数的变量出现的行时,会出现问题,用逗号和空格分隔。

所以第一行的输出应如下所示:

[1234] 0663 + [1234] 0667 + [1234] 0673 + [1234] 0677 + [1234] 0693 + [1234] 0697 + [1234] 0703 + [1234] 0707

第二行:

[1234] 0663 + [1234] 0667 + [1234] 0673 + [1234] 0677 + [1234] 0693

等等。

基本上,所有出现的四位数字符必须替换为:

[1234] xxxx

(" [1234]"是一个常数字符串)(x代表一个数字)

, 

(逗号空间)

必须替换为

+

(加号)

因此,它不能在行的开头和结尾都有+号,因此为什么,这四个数字与","分开处理。 (逗号空间)。

通常,我会做替换模式,如:

[1234] \1

但这会放[1234]和最后保存的模式,所以在第一行的情况下,它将被替换为:

[1234] 0707

此外,"," (逗号空格)部分必须始终替换为加号。

1 个答案:

答案 0 :(得分:2)

使用基于\G的正则表达式和条件替换模式:

查找内容(?:\G,\h*|^sum\(\{foo,\h*c\[)(\d{4})(\]\}\))?
替换为(?{2}[1234] $1:[1234] $1 + )

注意:如果]})必须显示在该行的末尾,请添加$ - (\]\}\)$)?

enter image description here

<强>详情:

  • (?:\G,\h*|^sum\(\{foo,\h*c\[) - 字符串/行开头的sum({foo, c[类似模式(请参阅^sum\(\{foo,\h*c\[)或上一次成功匹配的结尾,和0 +水平空格(见\G,\h*
  • (\d{4}) - 第4组:正好是四位数
  • (\]\}\))? - 可选的第2组:]}),一次或零次的序列

替换模式:

  • (?{2} - (条件替换模式启动)如果组2匹配:
    • [1234] $1 - 文字[1234] 子字符串和第1组值
    • : - 其他
    • [1234] $1 + - 文字[1234] 子字符串,第1组值和 + 文字字符序列
  • ) - 有条件替换的结束。