Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用一个正则表达式就可以解决这个问题吗?_Regex - Fatal编程技术网

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

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

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

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额外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
    )
)