[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
答案 0 :(得分:3)
您通常无法在后视中使用+
或*
,只能在前瞻中使用。
如果c#确实允许这些,那么您可以使用.*?
代替.*
,因为.*
将使用第二个:
试试这个:
(?<=\[SOME_WORDS:)(?=\d+:(\d+)])
匹配将在第一个捕获组
来自http://www.regular-expressions.info/lookaround.html
坏消息是大多数正则表达式都不允许你在lookbehind中使用任何正则表达式,因为它们不能向后应用正则表达式。正则表达式引擎需要能够在检查lookbehind之前找出要退回的字符数。在评估lookbehind时,正则表达式引擎确定lookbehind内的正则表达式的长度,后退主题字符串中的许多字符,然后从左到右应用正则表达式中的正则表达式,就像使用普通正则表达式一样。 / p>
答案 1 :(得分:2)
罗伯特·斯密特提到这是因为*
是一个贪婪的算子。贪婪的运算符在首先匹配时会消耗尽可能多的字符。如果匹配失败,他们只会放弃角色。如果使贪婪的运算符变为惰性(*?
),则匹配会尽可能少地使用字符以使匹配成功,因此:
不会消耗*.
您也可以使用[^:]*
使用与:
以外的任何字符匹配的{{1}}。