正则表达式?在后面不消耗

时间:2013-04-01 13:02:03

标签: .net regex lookahead

Lookbehind with?没有消耗

正则表达式:

(?i)(?<=\bsubject:?).+$

文本:

主题:asdf adsf

匹配

asdf adsf

我不希望包含在匹配

如果我搜索:
主题asdf adsf
匹配:
asdf adsf
这就是我想要的行为 它似乎将:视为可选但不消费

如果我只匹配主题:?它很贪婪,包括

4 个答案:

答案 0 :(得分:1)

使用此正则表达式(?i)(?<=\bsubject:?)[^:].*$

答案 1 :(得分:0)

你有一个问号:这将使冒号可选。

(?i)(?<=\bsubject:).+$

答案 2 :(得分:0)

这对我来说没问题:

(?i)(?<=subject:).+$

删除额外的问号。

答案 3 :(得分:0)

除非我误解了,否则我认为你不需要预见到它?

如果您只是跟随Subject之后的任何内容,那么这就是您的正则表达式:

Subject\:?(.+)$

如果您正在追踪SubjectsubjectsuBject之后的任何内容,那么这就是您的正则表达式:

(?i)Subject\:?(.+)$

如果仍然需要,请再次添加您的字边界\b

\bSubject\:?(.+)$(?i)\bSubject\:?(.+)$

所以,在C#.NET中:

Regex r = new Regex(@"(?i)Subject\:?(.+)$");

Match m = r.Match("Subject asdf asdf");
Console.WriteLine(m.Groups[1]);

m = r.Match("Subject: asdf asdf");
Console.WriteLine(m.Groups[1]); 

//Both output ' asdf asdf' - you might want to trim this.  
//Or add optional space \s? after the optional colon \:? in your regex.

或者,不是依靠魔术常量与隐式编号的捕获组对齐,而是明确命名(和引用)该组:

string captureName = "yourcap";

Regex r = new Regex(@"(?i)Subject\:?(?<"+captureName+">.+)$");
Match m = r.Match("Subject asdf asdf");
Console.WriteLine(m.Groups[captureName]);