0

重複の可能性:
一致に失敗した一致文字列の正規表現インデックス

件名がある場合:

0123456789abcdef...

そして私はパターンを持っています

\d+TEST

明らかに失敗します。ここで、到達した最大インデックスを知りたいと思います。つまり、正規表現エンジンは次のことを行います。

最初に数字に一致するため、そのインデックスを数字でもある次の文字に移動しました。この手順は、正規表現エンジンが番号を見つけるまで繰り返されます9。次の文字が aTではないため、失敗します。正規表現エンジンが失敗するまで 10 文字の移動に成功したため、インデックスを取得したいと思います。10この情報を取得する方法はありますか?複数のドキュメントの著作権を確認する必要があり、正規表現を使用して行います。正規表現が失敗したインデックスを知ることができればうれしいです。

4

2 に答える 2

0

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.
于 2012-07-30T17:57:48.430 に答える
-1

これを繰り返し行うことができます:

check for pattern \d+T
...then for patter \d+TE
....then for pattern \d+TES   and so on ...this way you can figure out how far you reached
于 2012-07-30T17:41:50.500 に答える