我想知道是否有一个正则表达式给出了例如这个输入:
lkjs kjsfjkijsfjá 13total wer6klje额外lñkjshvkjsdfjk dj d 22total kejk jksfljkakvhjr j 3total fkljbher jr6 hrew7 hwr 41total < / strong> sfdkj额外的iuwefjkwf7 7erfh sf 5total klj kj kjsef87 jhwfe7 89 jhf
可以输出这3个匹配,这些匹配是total
之后的数字,在找到下一个数字之后(并且在找到下一个数字之前)不包含单词additional
:
22
3
5
所以,例如我不匹配13因为
13total wer6klje额外的lñkjshvkjsdfjk dj d 22total
包含单词additional
我与41
不匹配,因为
41总 sfdkj额外的iuwefjkwf7 7erfh sf 5total
包含单词additional
让我解释一下示例中使用的输入结构:
randomText 13total randomText aditional randomText
22total randomText
3total randomText
41total randomText aditional randomText
5total randomText
所以基本上输入就像:
randomText X_total randomText_that_contains_or_not_'additional'
X_total randomText_that_contains_or_not_'additional'
....
X_total randomText_that_contains_or_not_'additional'
我知道如何使用一些额外的代码解决问题(使用几个模式和匹配,if-else结构......)但我正在使用的系统无法使用它们。它只能用一个正则表达式(这是一个复杂的系统,不易修改)。
因此,例如,使用正则表达式[0-9]+(?=total)
我会得到以下匹配:13
,22
,3
,41
,{{1 }}
但正如我所说,我只需要5
,22
,3
任何人都可以构建一个更复杂的正则表达式来匹配这3个数字吗?
谢谢!
答案 0 :(得分:2)
当然有可能(假设你的正则表达式支持lookahead assertions)
\d+(?=total(?!\D*additional))
\d+
匹配一个或多个数字
(?=total(?!\D*additional))
嵌套的外观断言。数字必须跟随&#34;总数&#34;没有附加(仅中间有非数字)
基于贝尔吉斯评论的更高级的例子:
\d+(?=total(?!(?:.(?!\d+total))*additional))
只要我找不到\d+total
答案 1 :(得分:2)
你可以使用(total
前面总会有一个数字,对吗?)
\d+(?=total(?!(?:\D|\d(?!total))*additional))
<强>解释强>
我们的想法是在下一个additional
:
<digit>total
\d+ # digits
(?=total # followed by total
(?! # not followed by...
(?:
\D++ # not a digit (possessive quantifier)
| # OR
\d(?!total) # a digit, but not followed by total
)*+ # any number of times
additional
)
)
如果找到一个正面的正面结果将会失败,我们肯定不会因<digit>total
而错过(?:\D|\d(?!total))
。
请参阅demo here。