2 つの別々の検索を行う必要があります。
コード例では、正規表現エンジンは実際に文字列の最後に到達しました。エンジン自体は、文字列を一致がないものとして拒否するときに、考えられるすべての一致を考慮します。「10文字目に移動して停止しました」という情報は取得できません。これは、正規表現エンジンが最終的に終了する前に実際に16文字目に移動したためです。
あなたが求めていることについては、最初にこれを行います:
string source = @"0123456789abcdef";
Regex r = new Regex(@"\d+TEST")
MatchCollection matches = r.Matches(source); // Returns no matches
これは、完全な文字列に一致するものが存在するかどうかを返します。失敗した場合は、これを実行します。
if (matches.Count == 0) {
r = new Regex(@"\d+");
MatchCollection matches = r.Matches(source);
int maxpos = -1;
foreach (Match m in matches) {
if (m.Index + m.Length > maxpos) maxpos = m.Index + m.Length;
}
// returns 10
return maxpos;
}
編集: もう 1 つの代替方法は、「TEST」文字列をオプションの一致にすることです。次に、一致のリストを確認できます。これには、数字のみの一致と数字 + TEST 文字列の一致の両方が含まれます。
string source = @"0123456789abcdef";
Regex r = new Regex(@"\d+(TEST)?")
MatchCollection matches = r.Matches(source); // Returns one match of 10 digits at position 0 - 10.