如何在链式正则表达式(notepad ++)中替换此表达式?

时间:2016-06-17 15:09:05

标签: regex chain

我有这个文字

14 p 25 25 3 12 4 40 5 10

我想获得" 14两个14 25三个14 25 12四个14 25 12 40五个14 25 12 40 10"

例如,当我更换(14两个)(14两个14)这个开始于14之后,我不能在两个之后开始。

还有其他选择吗? 例如,使用未包含在匹配中的组(匹配前的组)来替换它?

请帮帮我

1 个答案:

答案 0 :(得分:0)

这应该适合你:

正则表达式((?:\s?\d+\s?)+)((?:[a-zA-Z](?![^a-zA-Z]+\1))+)

替换$1$2 $1

您需要点击“替换所有”按钮才能工作(不能一次完成,只要能找到匹配就必须重复。{{ 3}})

Online PHP example

<强>解释

  • \s:匹配单个空格字符
  • ?:前一个表达式必须匹配0或1次。
  • \s?:匹配空格字符0或1次。
  • \d:匹配一个数字字符(相当于[0-9])。
  • +:前一个表达式必须至少匹配一次(u到无限)。
  • \d+:匹配尽可能多的数字字符(但至少有一次)。
  • ():捕获组
  • (?:):非捕获组
  • ((?:\s?\d+\s?)+):匹配可选空格字符,后跟一个或多个数字字符,后跟可选空格字符。表达式被非捕获组包围,后跟加号。这意味着正则表达式会尝试尽可能多地匹配空格和数字字符的组合(所以你最终会得到类似'14 25 12 40'的东西)。

捕获组旨在保留值以在替换中重用它。您不能简单地在捕获组的末尾添加加号而不包含非捕获组,因为它只会记住最后一个数字捕获(' 12'而不是整个'14 25 12'用于建立'14 25 12 40')。

  • [a-zA-Z]:在任何情况下匹配任何英文字母(下,上)。
  • \1:引用第一组中捕获的内容。
  • (?!):否定前瞻。
  • [^]:负字符类,因此[^a-zA-Z]表示匹配任何内容
  • ((?:[a-zA-Z](?![^a-zA-Z]+\1))+):负向前瞻是为了确保我们并不总是最终匹配输入文本中的第一个“14”。没有它,我们最终将进入一个无限循环,结果为“14 two 14 14 14 14 14 14 25 three 12 4 40 5 10”(重复“25”之前的“14”,直到你达到超时)。 / LI>

基本上,对于我们匹配的每个英文字母,我们都要求断言我们的数字序列中不存在第一个捕获组的内容(例如“14”)。

对于替换,$1$2 $1表示放置捕获组1和2的内容,添加空格并再次放置捕获组1的内容。