? で後読み は消費していません:
正規表現:
(?i)(?<=\bsubject:?).+$
文章:
件名: asdf adsf
マッチ
: asdf 広告
:をマッチに含めたくない
検索すると:
件名 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]);