【发布时间】:2014-09-15 23:14:24
【问题描述】:
[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 中实际完成时没有问题
【问题讨论】:
-
简单地回答,没有。
-
为什么不这样做:
\[SOME_WORDS:\d+:(\d+)\]?或者即使你不能保证数字是数字:\[SOME_WORDS:.+:(.+)\] -
@Garry 你可以试试这个
(?<=\[SOME_WORDS:[^:]*:).*(?=]) -
@AvinashRaj 不确定这是有效的正则表达式