匹配以已知字符串开头的数字,后跟未知数量的字符

时间:2014-09-12 13:53:47

标签: c# regex

[SOME_WORDS:200:1000]

尝试仅匹配最后一个1000部分。这两个数字都是可变的,并且可以包含未知数量的字符(虽然它们预计包含数字,但我不能排除它们也可能包含其他字符)。 SOME_WORDS部分是已知的,不会更改。

所以我首先对[SOME_WORDS:做一个积极的观察,然后对尾随]做一个积极的预测
这给了我们模式(?<=\[SOME_WORDS:).*(?=])
并捕获部分200:1000

现在因为我不知道SOME_WORDS:之后有多少个字符,但我知道它以另一个:结尾,我使用.*:表示任何字符的任何数量时间后跟:
这给了我们模式(?<=\[SOME_WORDS:.*:).*(?=])

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

如果我假设第一个数字总是3个字符,我可以用.*替换...来获取模式(?<=\[SOME_WORDS:...:).*(?=]),这样就可以正确捕获1000部分。但是,我不明白为什么用...替换.*会使模式无法捕获任何内容。

编辑: 我用来测试正则表达式模式的在线工具似乎没有正常工作。模式(?<=\[SOME_WORDS:.*:).*(?=])1000匹配,在.net

中实际完成时没有任何问题

2 个答案:

答案 0 :(得分:3)

您通常无法在后视中使用+*,只能在前瞻中使用。 如果c#确实允许这些,那么您可以使用.*?代替.*,因为.*将使用第二个:

试试这个: (?<=\[SOME_WORDS:)(?=\d+:(\d+)]) 匹配将在第一个捕获组

来自http://www.regular-expressions.info/lookaround.html

  

坏消息是大多数正则表达式都不允许你在lookbehind中使用任何正则表达式,因为它们不能向后应用正则表达式。正则表达式引擎需要能够在检查lookbehind之前找出要退回的字符数。在评估lookbehind时,正则表达式引擎确定lookbehind内的正则表达式的长度,后退主题字符串中的许多字符,然后从左到右应用正则表达式中的正则表达式,就像使用普通正则表达式一样。 / p>

答案 1 :(得分:2)

罗伯特·斯密特提到这是因为*是一个贪婪的算子。贪婪的运算符在首先匹配时会消耗尽可能多的字符。如果匹配失败,他们只会放弃角色。如果使贪婪的运算符变为惰性(*?),则匹配会尽可能少地使用字符以使匹配成功,因此:不会消耗*.您也可以使用[^:]*使用与:以外的任何字符匹配的{{1}}。