如何计算大字符串中字符串的出现次数并获取子字符串直到第n次出现?

时间:2014-01-03 10:07:01

标签: c# regex string

我有一个这样的字符串:

  

来自维基百科的这句话 - 这是一般性介绍   访问维基百科。该项目还有一篇百科全书文章   关于它自己,维基百科,以及一些有抱负的介绍   贡献者。有关如何捐赠给组织的信息   运行维基百科,请参阅给予的方式。 @ ## @这句话来自   谷歌 - 这是维基百科访问者的一般介绍。该   项目还有一篇关于自己,维基百科和。的百科全书文章   一些有抱负的贡献者的介绍。有关如何的信息   捐赠给运行维基百科的组织,请参阅给予的方式。   @ ## @这句话来自Facebook--这是一般性的介绍   对于维基百科的访问者。该项目还有一本百科全书   关于自己的文章,维基百科,以及一些有抱负的介绍   贡献者。有关如何捐赠给组织的信息   运行维基百科,请参阅给予的方式。 @ ## @

现在从字符串上面我想计算模式“@ ## @”的出现次数。 在此之后我想要子串直到字符串中第二次出现这种模式。

所以在上面的例子中我想要的结果是:

  

Count = 3 substring =“这是来自维基百科的句子 - 这是一个   维基百科访客的一般介绍。该项目也有   关于自身,维基百科等的百科全书文章   有抱负的贡献者的介绍。有关如何使用的信息   捐赠给运行维基百科的组织,请参阅给予的方式。 @ ## @   这句话来自谷歌 - 这是一般性的介绍   访问维基百科。该项目还有一篇百科全书文章   关于它自己,维基百科,以及一些有抱负的介绍   贡献者。有关如何捐赠给组织的信息   运行维基百科,请参阅给予的方式。“

任何人都可以建议我怎么做这个。提前谢谢。

4 个答案:

答案 0 :(得分:3)

试试这个:

 var splitted = text.Split(new[]{"@##@"}, StringSplitOptions.RemoveEmptyEntries);
 var count = splitted.Count();
 var result = string.Join("@##@", splitted.Take(2).ToArray());

count将包含3,结果将包含您想要的字符串

试试here at Ideone

答案 1 :(得分:0)

您想使用Split方法。

public static Regex regex = new Regex(
  "@##@",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.Compiled
);

string[] results = regex.Split(InputText);

答案 2 :(得分:0)

s = "... wikipedia string ...";
// define n, you probably have a dynamic n or one that's defined elsewhere...
n=2;
// split the string only n times
string[] parts = s.Split(new string[] {"@##@"}, n, StringSplitOptions.None);
// show splits (use them however you want)
System.Show(parts);

答案 3 :(得分:0)

Split方法的替代方法,对大字符串更有效:

public static class StringExtensions
{
    public static IEnumerable<int> AllIndexesOf(this string source, string substring)
    {
        int index = -1;
        while ((index = source.IndexOf(substring, index + 1)) >= 0)
            yield return index;
    }
}

然后你可以这样称呼它:

int[] indexes = mystring.AllIndexesOf("@##@").ToArray();
int count = indexes.Length;
string substring = count > 0 ? mystring.Substring(0, indexes[0]) : mystring;