使用indexOf from string </int>中的位置提取List <int>

时间:2014-12-17 14:33:25

标签: c# string substring

我想让IndexOf获得一些“Text”及其在字符串中的位置

string myString = "some text some text some text text text text";
int countOfText = myString.Select((c, i) => myString.Substring(i)).Count(sub => sub.StartsWith("some"));

在上面的代码中我得到了“some”的数量,如何获得List的位置?

4 个答案:

答案 0 :(得分:3)

Regex.Matches(input,@"\bsome\b")
     .Cast<Match>()
     .Select(x=>x.Index);

答案 1 :(得分:0)

最有效的方法是在带有起始索引的循环中使用String.IndexOf

List<int> positions = new List<int>();
int pos = myString.IndexOf("some", StringComparison.CurrentCultureIgnoreCase);
while (pos >= 0)
{
    positions.Add(pos);
    pos = myString.IndexOf("some", pos + "some".Length, StringComparison.CurrentCultureIgnoreCase);
}

结果:0, 10, 20

我使用StringComparison.CurrentCultureIgnoreCase来演示不区分大小写的比较。如果"Some"不应计算,您就不需要它。

答案 2 :(得分:0)

您可以使用Regex(@Anirudha答案)或linq:

执行此操作
string myString = "some text some text some text text text text";
var res = myString
    .Select((c, i) => new { txt = myString.Substring(i), idx = i })
    .Where(sub => sub.txt.StartsWith("some"))
    .Select(a => a.idx).ToList();

(这似乎有点矫枉过正,我更喜欢自己的正则表达式版本)

答案 3 :(得分:0)

这是一种帮助我这样做的扩展方法。如果你想在你的代码中多次收集索引,我会使用它。

public static IEnumerable<int> AllIndexesOf(this string str, string searchstring)
{
    int minIndex = str.IndexOf(searchstring);
    while (minIndex != -1)
    {
        yield return minIndex;
        minIndex = str.IndexOf(searchstring, minIndex + searchstring.Length);
    }
}

用法:

string myString = "some text some text some text text text text";
List<int> Result = myString.AllIndexesOf("some");