我有这个文字
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之后,我不能在两个之后开始。
还有其他选择吗? 例如,使用未包含在匹配中的组(匹配前的组)来替换它?
请帮帮我
答案 0 :(得分:0)
这应该适合你:
正则表达式:((?:\s?\d+\s?)+)((?:[a-zA-Z](?![^a-zA-Z]+\1))+)
替换:$1$2 $1
您需要点击“替换所有”按钮才能工作(不能一次完成,只要能找到匹配就必须重复。{{ 3}})
<强>解释强>:
\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的内容。