向后看?不消耗:
正则表达式:
(?i)(?<=\bsubject:?).+$
文本:
主题: asdf adsf
匹配
: asdf adf
我不希望:包含在比赛中
如果我搜索:
主题 asdf adsf
它匹配:
asdf adsf
这就是我想要的行为
它似乎将 : 视为可选但不消耗
如果我只匹配主题:?它是贪婪的,包括:
使用这个正则表达式(?i)(?<=\bsubject:?)[^:].*$
: 后面有一个问号,这将使冒号成为可选的。
(?i)(?<=\bsubject:).+$
这对我来说没问题:
(?i)(?<=subject:).+$
去掉多余的问号。
除非我误解了,否则我认为您不需要对此进行展望?
如果您只是在遵循以下内容Subject
,那么这就是您的正则表达式:
Subject\:?(.+)$
如果您追求以下内容Subject
,subject
或者例如suBject
,这就是您的正则表达式:
(?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]);