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

How can I replace this expression in chain regex (notepad++)?

我有这篇文章

14 二 25 三 12 四 40 五 10

我要获取“14二1425三142512四14251240五1425124010”

例如,当我将 (14 two ) 替换为 (14 two 14 ) 这个在 14 之后开始的我无法在 2 之后开始。

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

请帮帮我

这应该可以解决您的问题:

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

替换

您需要单击“全部替换”按钮才能生效(不能一次完成,必须尽可能重复找到匹配项。Online PHP example)

解释:

  • \s:匹配单个space字符
  • ?: 前面的表达式必须匹配0次或1次。
  • \s?: 匹配一个space字符0次或1次。
  • \d:匹配一个数字字符(相当于[0-9])。
  • +:前面的表达式必须至少匹配一次(u到无限)。
  • \d+:匹配尽可能多的数字字符(但至少匹配一次)。
  • (): 捕获组
  • (?:): 非捕获组
  • ((?:\s?\d+\s?)+):匹配一个可选的 space 字符后跟一个或多个数字字符后跟一个可选的 space 字符。该表达式被一个非捕获组包围,后跟一个加号。这意味着正则表达式将尝试匹配尽可能多的 space 和数字字符的组合(因此您最终可能会得到类似“14 25 12 40”的结果)。

捕获组旨在保留值以在 replacement.You 中重复使用它不能简单地在捕获组末尾添加加号而不包含非捕获组,因为它只会记住最后一个数字捕获(“12”而不是整个“14 25 12”用于构建“14 25 12 40”)。

  • [a-zA-Z]:任意大小写匹配任意英文字母(小写,大写)。
  • </code>: 参考第一组中捕获的内容。</li> <li><code>(?!):否定前瞻。
  • [^]:负字符class,所以[^a-zA-Z]表示匹配任何东西
  • ((?:[a-zA-Z](?![^a-zA-Z]+))+):否定先行是为了确保我们不会总是匹配输入文本中的前“14 two”。没有它,我们最终会陷入无限循环,结果为“14 二 14 14 14 14 14 14 25 三 12 四 40 五 10”(重复“25”之前的“14”,直到达到超时)。

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

替换, 表示把捕获组1和2的内容,加一个space,把捕获组1的内容再放一次。