Lookbehind with?没有消耗:
正则表达式:
(?i)(?<=\bsubject:?).+$
文本:
主题:asdf adsf
匹配
: asdf adsf
我不希望:包含在匹配
中如果我搜索:
主题asdf adsf
匹配:
asdf adsf
这就是我想要的行为
它似乎将:视为可选但不消费
如果我只匹配主题:?它很贪婪,包括:
答案 0 :(得分:1)
使用此正则表达式(?i)(?<=\bsubject:?)[^:].*$
答案 1 :(得分:0)
你有一个问号:这将使冒号可选。
(?i)(?<=\bsubject:).+$
答案 2 :(得分:0)
这对我来说没问题:
(?i)(?<=subject:).+$
删除额外的问号。
答案 3 :(得分:0)
除非我误解了,否则我认为你不需要预见到它?
如果您只是跟随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]);