パターンの複数回の出現に一致できる C# 文字列検索アルゴリズムが必要です。たとえば、パターンが「AA」で文字列が「BAAABBB」の場合、正規表現は一致結果のインデックス = 1 を生成しますが、結果のインデックス = 1,2 が必要です。正規表現にそのような結果を強制することはできますか?
6 に答える
先読みパターンを使用する:-
「あ(?=あ)」
これにより、後続の A を消費することなく、別の A が後に続く任意の A が検出されます。したがって、AAA はこのパターンに 2 回一致します。
以前のすべてのコメントを要約するには:
Dim rx As Regex = New Regex("(?=AA)")
Dim mc As MatchCollection = rx.Matches("BAAABBB")
これにより、要求している結果が生成されます。
編集:
これがC#バージョンです(今日はVB.NETで動作しているので、誤ってVB.NETを続行しました)。
Regex rx = new Regex("(?=AA)");
MatchCollection mc = rx.Matches("BAAABBB");
たった2文字のサブストリングを本当に探していますか?その場合、使用する正規表現(または非正規表現の手法)に関係なく、2,000万文字の文字列の検索は遅くなります。検索文字列が長い場合、正規表現エンジンは、Boyer-MooreやKnuth-Morris-Prattなどの検索アルゴリズムを使用して検索を高速化できます。実際、長いほど優れています。
ちなみに、あなたが話している種類の検索は、重複一致と呼ばれます。それをタグに追加します。
これを試して:
System.Text.RegularExpressions.MatchCollection matchCol;
System.Text.RegularExpressions.Regex regX = new System.Text.RegularExpressions.Regex("(?=AA)");
string index="",str="BAAABBB";
matchCol = regX.Matches(str);
foreach (System.Text.RegularExpressions.Match mat in matchCol)
{
index = index + mat.Index + ",";
}
インデックスの内容は、最後のコンマを削除して探しているものです。
任意の正規表現でMatchCollectionの配列を指定できます
Regex.Matches() http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchcollection.aspx