匹配一个前面是已知字符串,后面是未知字符数的数字

本文关键字:未知 字符 数字 字符串 前面 一个 | 更新日期: 2023-09-27 18:21:36

[SOME_WORDS:200:1000]

试图只匹配最后一个1000部分。这两个数字都是可变的,可以包含未知数量的字符(尽管它们应该包含数字,但我不能排除它们也可能包含其他字符)。SOME_WORDS部分是已知的,不会更改。

因此,我首先对[SOME_WORDS:进行正向查找,然后对后面的]进行正向查找
这给了我们模式(?<='[SOME_WORDS:).*(?=])
并捕获零件200:1000

现在,因为我不知道SOME_WORDS:后面有多少个字符,但我知道它以另一个:结尾,所以我使用.*:来指示任何字符,任何时间都可以跟在:后面
这给了我们(?<='[SOME_WORDS:.*:).*(?=]) 模式

然而,在这一点上,模式不再匹配任何东西,这就是我感到困惑的地方。我在这里做错了什么?

如果我假设第一个数字总是3个字符长,我可以用...替换.*以获得模式(?<='[SOME_WORDS:...:).*(?=]),并且这只正确地捕获了1000部分。然而,我不明白为什么用.*替换...会使模式无法捕获任何内容。

编辑:我用来测试regex模式的在线工具似乎无法正常工作。当在.net 中实际执行时,模式(?<='[SOME_WORDS:.*:).*(?=])1000匹配而没有问题

匹配一个前面是已知字符串,后面是未知字符数的数字

通常不能在后备中使用+*,只能在先行中使用。如果c#允许这些,则可以使用.*?而不是.*,因为.*将吃掉第二个:

试试这个:(?<='[SOME_WORDS:)(?='d+:('d+)])比赛将在第一个捕获组中进行

报价来源http://www.regular-expressions.info/lookaround.html

坏消息是,大多数正则表达式风格不允许在lookbacking中只使用任何正则表达式,因为它们不能向后应用正则表达式。正则表达式引擎需要能够在检查查找表之前计算出要后退多少个字符。在评估查找表时,正则表达式引擎确定查找表中正则表达式的长度,后退主题字符串中的多个字符,然后像使用普通正则表达式一样,从左到右在查找表中应用正则表达式。

正如Robert Smit提到的,这是由于*是一个贪婪的运算符。贪婪的操作符在第一次匹配时会消耗尽可能多的字符。只有匹配失败时,他们才会放弃字符。如果您使贪婪运算符懒惰(*?),则匹配会消耗尽可能少的字符数以使匹配成功,因此:不会被*.消耗。您也可以使用[^:]*,它与:以外的任何字符匹配。