Regex 用一个正则表达式就可以解决这个问题吗?
我想知道是否有一个正则表达式给出了以下输入: lkjs kjsfjk IJSFJJá13总计wer6klje附加LNK jshv kjsdfjk dj d22总计kejk jksfljkakvhjr3总计 可以输出这3个匹配项,它们是后跟Regex 用一个正则表达式就可以解决这个问题吗?,regex,Regex,我想知道是否有一个正则表达式给出了以下输入: lkjs kjsfjk IJSFJJá13总计wer6klje附加LNK jshv kjsdfjk dj d22总计kejk jksfljkakvhjr3总计 可以输出这3个匹配项,它们是后跟total的数字,在之后(以及在查找下一个数字之前)不包含单词additional: 例如,我没有匹配13,因为 13总计wer6klje额外的lñk jshv kjsdfjk dj d22总计 包含单词附加 我没有匹配41,因为 41总计sfdkj额外iuwe
total
的数字,在之后(以及在查找下一个数字之前)不包含单词additional
:
例如,我没有匹配13,因为
13总计wer6klje额外的lñk jshv kjsdfjk dj d22总计
包含单词附加
我没有匹配41
,因为
41总计sfdkj额外iuwefjkwf7 7erfh sf5总计
包含单词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'
我知道如何使用一些额外的代码(使用一些模式和匹配,如果其他结构的话…)来解决这个问题,但是我使用的系统不能使用这些。它只是受够了一个正则表达式(这是一个复杂的系统,不容易修改)
因此,例如,使用正则表达式[0-9]+(?=total)
我将得到以下匹配:13
,22
,3
,41
,5
但正如我所说,我只需要22
,3
,5
有人能构建一个更复杂的正则表达式来匹配这3个数字吗
谢谢 当然有可能(考虑到您的正则表达式支持)
\d+
匹配一个或多个数字
(?=total(?!\D*额外))
嵌套的环顾断言。数字后面必须跟“总计”,不能跟其他数字(中间只有非数字)
基于Bergis评论的更高级示例:
\d+(?=total(?!(?:.(?!\d+total))*additional))
在这里,只要我没有找到\d+total
,我就搜索额外的数据,当然这是可能的(考虑到您的正则表达式支持)
\d+
匹配一个或多个数字
(?=total(?!\D*额外))
嵌套的环顾断言。数字后面必须跟“总计”,不能跟其他数字(中间只有非数字)
基于Bergis评论的更高级示例:
\d+(?=total(?!(?:.(?!\d+total))*additional))
在这里,只要我没有找到您可以使用的\d+total
(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
)
)
如果regex找到一个,则反向前瞻将使其失败,而且由于(?:\D |\D(?!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
)
)
如果regex找到一个,则反向前瞻将使其失败,而且由于(?:\D |\D(?!total))
,我们肯定不会传递总数
请参阅。\D
是一个很好的技巧,可以在所示的示例输入中使用,但我不确定实际文本是否保证不包含任何数字。您能否使附加
之前的文本不允许包含\d+total
?\d
是一个很好的技巧,可以用于所示的示例输入,但我不确定实际文本是否保证不包含任何数字。您能否使附加
之前的文本只允许包含\d+总计
?
\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
)
)