.NET正则表达式的后顾断言非贪婪模式

5
如何使后顾之忧变得贪婪? 在这种情况下,如果:存在,我希望后顾之忧可以消耗它。
m = Regex.Match("From: John", @"(?i)(?<=from:)....");
// returns ' Jon' what I expect not a problem just an example

m = Regex.Match("From: John", @"(?i)(?<=from:?)....");
// returns ': Jo'
// I want it to return ' Jon'

我发现了一个解决办法。
@"(?i)(?<=\bsubject:?\s+).*?(?=\s*\r?$)"

只要在“?”后添加一些肯定的语言,就可以排除贪婪匹配。出于同样的原因,我必须在向前查找中添加“$”符号。
但是如果您需要以可选模式结束,那么必须使用下面接受的答案。
1个回答

4

有趣的是,我不知道在.NET中它们是非贪婪的。这里有一个解决方法:

(?<=from(:|(?!:)))

这意味着:
(
  :     # match a ':'
  |
  (?!:) # otherwise match nothing (only if the next character isn't a ':')
) 

这会强制匹配 ':' (如果它存在的话)。


有些冗长但它可以工作,而且对我来说这样就行。谢谢。我认为回溯断言不贪婪是一个 bug。 - paparazzo
@Blam:刚意识到这可以简化为更简洁的形式。我更新了我的帖子。 - porges
不行,那个会导致编译器出错,请修复或返回原始答案。rSubject = new Regex(@"(?i)(?<=subject(:|(?!:)))........)"); - paparazzo
@Blam:你的示例中有一个错别字——最后一个 ')' 不应该出现。new Regex(@"(?i)(?<=subject(:|(?!:)))........") - porges
谢谢,看起来好像可以了。我已经给你点赞了,所以不能再点了。正则表达式很酷,但不太容易出错。 - paparazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接