【问题标题】:Find all pattern indexes in string in C#在 C# 中查找字符串中的所有模式索引
【发布时间】:2012-05-19 18:02:28
【问题描述】:

如何使用 c# 在字符串中查找模式的所有索引?

例如,我想在45##78$$#56$$JK01UU 这样的字符串中查找所有## 模式索引

【问题讨论】:

  • 如何定义“模式”?
  • 你有没有尝试过?你试过正则表达式吗?
  • 你能显示一些输入字符串和预期的输出吗?
  • 输入模式是##字符串是45##78$$#56$$JK01UU
  • 字符串 SearchPattern = "##";字符串 Str = "45##78$$#56$$JK01UU";​​

标签: c# regex string indexing


【解决方案1】:
 string pattern = "##";
 string sentence = "45##78$$#56$$J##K01UU";
 IList<int> indeces = new List<int>();
 foreach (Match match in Regex.Matches(sentence, pattern))
 {
      indeces.Add(match.Index);
 }

索引将有 2、14

【讨论】:

  • 或在 1 行中:var indices = Regex.Matches(_msg, pattern).Select(x => x.Index).ToList();
【解决方案2】:

编辑了代码,使其功能更简洁。

public IEnumerable<int> FindAllIndexes(string str, string pattern)
{
    int prevIndex = -pattern.Length; // so we start at index 0
    int index;
    while((index = str.IndexOf(pattern, prevIndex + pattern.Length)) != -1)
    {
        prevIndex = index;
        yield return index;
    }
}

string str = "45##78$$#56$$JK01UU";
string pattern = "##";

var indexes = FindAllIndexes(str, pattern);

【讨论】:

  • 我想这一定比使用正则表达式的答案要快。有一些分析结果会很高兴。
【解决方案3】:

您可以使用这样的正则表达式搜索来获取字符串中模式的所有索引。

string input = "45##78$$#56$$JK01UU", pattern = Regex.Escape("##");
Regex rx = new Regex(pattern);
var indices = new List<int>();
var matches = rx.Matches(s);
for (int i=0 ; i<matches.Length ; i++)
{
    indices.Add(matches[i].Index);
}

【讨论】:

  • 您可能需要在模式上运行Regex.Escape()
【解决方案4】:

另一个试图提高效率的人:

public IEnumerable<int> FindPatternIndexes(string input, string search)
{
    var sb = new StringBuilder(input);

    for (var i = 0; search.Length <= sb.Length; i++)
    {
        if (sb.ToString().StartsWith(search)) yield return i;
        sb.Remove(0,1);
    }
}

【讨论】:

    【解决方案5】:

    经过测试。工作。但是有点笨。

    string foo = "45##78$$#56$$JK01UU";
    char[] fooChar = foo.ToCharArray();
    
    int i = 0;
    bool register = false;
    
    foreach (char fc in fooChar)
    {
        if (fc == '#' && register == true)
        {
            MessageBox.Show("Index: " + (i-1));
        }
        else if (fc == '#')
        {
            register = true;
        }
        else
        {
            register = false;
        }
        i++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2016-02-15
      • 2021-09-09
      • 2012-05-29
      • 2012-11-15
      • 2012-11-03
      • 1970-01-01
      相关资源
      最近更新 更多