只用一个正则表达式就可以解决这个问题吗?

时间:2014-05-07 13:00:22

标签: regex

我想知道是否有一个正则表达式给出了例如这个输入:

  

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)我会得到以下匹配:1322341,{{1 }}

但正如我所说,我只需要5223

任何人都可以构建一个更复杂的正则表达式来匹配这3个数字吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

当然有可能(假设你的正则表达式支持lookahead assertions

\d+(?=total(?!\D*additional))

See it here on regex101

\d+匹配一个或多个数字

(?=total(?!\D*additional))嵌套的外观断言。数字必须跟随&#34;总数&#34;没有附加(仅中间有非数字)

基于贝尔吉斯评论的更高级的例子:

\d+(?=total(?!(?:.(?!\d+total))*additional))

See it on regex101

只要我找不到\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