我想删除范围〈F= ..
〉中除D以外的所有类型字符后面的数字。
regex:
(?:^<F=(?=.+>)|\G(?!^)).*[^d]\K[0-9]+
1.这可以捕获不在d之后的数字。但是,它不能一次捕获所有的数字。它从后面捕获。当我们删除最后捕获的数字时,它从左到右匹配下一个。
〈F= 1H 9D 6 kl〉实时7 x 1分钟1天1 x 7天
〈F= 1H 9D 6 kl〉右轴7
第7天
〈F=1H x 1 m3n1x D 6 kl〉实时数据7
1.数字在=未被捕获后第一个出现。〈F= 1
H9 D 6 kl〉rt 78 d 7
更新编号2:将[^d]
更改为(?<!d)
可解决此问题
1.匹配过程应介于=和〉之间,〈F= ..
〉。但在>
之后输入的数字也已被捕获。〈F= 1H 9D 6 kl〉rt 7 8
d 7
更新编号3:在将(?=. +
〉)更改为(?=. *
〉)并将位置更改为结尾(?:^〈F=|\G(?!^)).*[^d]\K[0-9]+ (?=.*>)
解决了这个问题,它只捕获>
之前的数字
预期产出:<F=HD6kl>rt78d7
对于所有可能的情况:
输入:〈F= 1H 2D 63 k43 l5〉rt 78 d 7
匹配:〈F= 1
高2
深6 3
k 43
升5
〉rt 78 d 7
输出:〈F= HD 6 kl〉rt 78 d 7
3条答案
按热度按时间mklgxw1f1#
好的,我们可以把正则表达式分成两部分,稍后再把它们连接起来。
*第1部分-
((?<!D)\d+
。我们使用负向后查找只匹配前面不带D
的数字。*第2部分-
(?=.*?>)
。我们只匹配=
和>
之间的数字。假设你的字符串是很好的模板化的,那么我们只需要使用正则表达式正向前瞻查找>
就足够了。将它们连接后的最终正则表达式为
((?<!D)\d+)(?=.*?>)
。这意味着只匹配前面不带
D
、后面不带>
的数字。代码段:
Online Demo
cmssoen22#
您可以选择匹配后跟数字的
D
:说明
(?:
备选项的非捕获组^<F=
Assert字符串的开头,然后匹配<F=
|
或\G(?!^)
在上一个匹配项的末尾而不是字符串的开头Assert当前位置(?=[^\n>]*>)
正前瞻,Assert>
以外的可选字符(或换行符),然后匹配>
)
关闭非捕获组(?:D\d)?
可选地匹配后跟一个数字的D
字符(或使用\d+
表示1+位数)[^\d>\n]*
匹配可选字符,而不是数字>
或换行符(如果您不想匹配交叉行)\K
忘记目前匹配的内容\d+
匹配1+位数请参见regex demo和PHP demo。
产出
jtjikinw3#
有了先行和后行功能,一个简单的字符串函数就可以满足您的需求。POC:
结果:
原件:〈F=1H2D63k43l5〉rt78d7
预期值:〈F=HD6kl〉rt78d7
实际值:〈F=HD6kl〉rt78d7