1. ホーム
  2. c#

[解決済み] C#で大きな文字列の中の部分文字列の位置をすべて見つける

2023-04-17 07:40:30

質問

大きな文字列を解析する必要があるのですが、その際に extract"(me,i-have lots. of]punctuation のすべてのインスタンスを見つけ、それぞれのインデックスをリストに格納する必要があります。

つまり、この文字列の一部が大きな文字列の最初と途中にあったとすると、その両方が見つかり、そのインデックスが List に追加されます。 List を含むことになります。 0 を含み、他のインデックスはそれが何であろうと

いろいろと遊んでみたのですが string.IndexOf ほとんど を実行し、いくつかのコードを書きましたが、うまくいかず、何が間違っているのか正確に把握することができませんでした。

List<int> inst = new List<int>();
int index = 0;
while (index < source.LastIndexOf("extract\"(me,i-have lots. of]punctuation", 0) + 39)
{
    int src = source.IndexOf("extract\"(me,i-have lots. of]punctuation", index);
    inst.Add(src);
    index = src + 40;
}

  • inst = リスト
  • source = 大きな文字列

何か良いアイデアはありませんか?

どのように解決するのですか?

そのための拡張メソッドの例です。

public static List<int> AllIndexesOf(this string str, string value) {
    if (String.IsNullOrEmpty(value))
        throw new ArgumentException("the string to find may not be empty", "value");
    List<int> indexes = new List<int>();
    for (int index = 0;; index += value.Length) {
        index = str.IndexOf(value, index);
        if (index == -1)
            return indexes;
        indexes.Add(index);
    }
}

これを静的なクラスにして、名前空間をインポートすると using とすれば、任意の文字列に対するメソッドとして表示され、そのまま実行できる。

List<int> indexes = "fooStringfooBar".AllIndexesOf("foo");

拡張メソッドの詳細については http://msdn.microsoft.com/en-us/library/bb383977.aspx

また、イテレータを使っても同じです。

public static IEnumerable<int> AllIndexesOf(this string str, string value) {
    if (String.IsNullOrEmpty(value))
        throw new ArgumentException("the string to find may not be empty", "value");
    for (int index = 0;; index += value.Length) {
        index = str.IndexOf(value, index);
        if (index == -1)
            break;
        yield return index;
    }
}