2

次の問題の解き方がわかりません。

入力文字列「aaaabaa」があり、文字列「aa」を検索しようとしています (文字の位置を探しています) 期待される結果は 0 1 2 5 です

  • ああああああ
  • ああああああ_
  • ああああああ_
  • ああああああ

この問題は、別のアプローチ(非正規表現)を使用してすでに解決されています。しかし、正規表現が必要です。正規表現は初めてなので、グーグル検索は本当に役に立ちません。どんな助けでも大歓迎です!ありがとう!

PS私は使用しようとしまし(aa)*"\b(\w+(aa))*\w+"が、それらの表現は間違っています

4

3 に答える 3

2

これは、先読みを使用して解決できます

a(?=a)

別の「a」が後に続くすべての「a」を検索します。

これをより一般的にしたい場合

(\p{L})(?=\1)

これにより、同じ文字が後に続くすべての文字が検索されます。見つかったすべての文字はキャプチャ グループに格納されます (括弧で囲まれているため)。このキャプチャ グループは、 (一致する文字が格納されている場合) を使用して肯定的な先読みアサーション( (?=...)) によって再利用されます。\1\1

\p{L}カテゴリ「文字」の Unicode コード ポイントです。

コード

String text = "aaaabaa";
Regex reg = new Regex(@"(\p{L})(?=\1)");

MatchCollection result = reg.Matches(text);

foreach (Match item in result) {
    Console.WriteLine(item.Index);
}

出力

0
1
2
5

于 2012-04-24T08:56:57.000 に答える
0

次のコードは、実際の表現を変更することなく、任意の正規表現で機能するはずです。

        Regex rx = new Regex("(a)\1"); // or any other word you're looking for.

        int position = 0;
        string text = "aaaaabbbbccccaaa";
        int textLength = text.Length;

        Match m = rx.Match(text, position);

        while (m != null && m.Success)
        {
            Console.WriteLine(m.Index);

            if (m.Index <= textLength)
            {
                m = rx.Match(text, m.Index + 1);
            }
            else
            {
                m = null;
            }
        }

        Console.ReadKey();

オプションを使用して、連続する検索ごとに正規表現検索の開始インデックスを変更します。実際の問題は、正規表現エンジンがデフォルトで、前の一致の後も常に検索を続行するという事実から生じます。そのため、先読み構造を使用するか、開始インデックスを手動で設定することによって指示しない限り、別の一致内で可能な一致を見つけることはありません。

もう 1 つの比較的簡単な解決策は、式全体を先読みすることです。

        string expression = "(a)\1"
        Regex rx2 = new Regex("(?=" + expression + ")");
        MatchCollection ms = rx2.Matches(text);
        var indexes = ms.Cast<Match>().Select(match => match.Index);

こうすることで、エンジンは一致が見つかるたびに自動的にインデックスを 1 つ進めます。

ドキュメントから

NextMatch メソッドを呼び出して一致の試行が繰り返されると、正規表現エンジンは空の一致を特別に処理します。通常、NextMatch は、前の一致が中断したところから次の一致の検索を開始します。ただし、空の一致の後、NextMatch メソッドは次の一致を試行する前に 1 文字進みます。この動作により、正規表現エンジンが文字列を処理することが保証されます。そうしないと、空の一致では前方への移動が発生しないため、次の一致は前の一致とまったく同じ場所から開始され、同じ空の文字列に繰り返し一致します。

于 2012-04-24T13:55:09.203 に答える
-1

これを試して:

Javaで正規表現を使用して繰り返される文字を見つけるにはどうすればよいですか?

それはJavaにありますが、正規表現と非正規表現の方法があります。C# Regex は、Java の方法と非常によく似ています。

于 2012-04-24T08:56:46.647 に答える