在C#中查找字符串中所有模式的索引

5

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

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


你如何定义“模式”? - Cheng Chen
你尝试过什么吗?你尝试过正则表达式吗? - SCB
1
你能展示一些输入字符串和预期输出吗? - Habib
输入模式为## 字符串为45##78$$#56$$JK01UU - sanchop22
字符串 搜索模式 = "##"; 字符串 Str = "45##78$$#56$$JK01UU"; - sanchop22
@petre:SearchPattern和Str是输入字符串,您想输出什么作为结果? - Cheng Chen
5个回答

9
 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。


var indexes = Regex.Matches(_msg, pattern).Select(x => x.Index).ToList(); - WtFudgE

3

编辑代码,将其改为更简洁的函数。

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);

我猜这一定比使用正则表达式的答案要快。有一些分析结果会很好。 - mortb

2
您可以通过使用正则表达式搜索来获取字符串中模式的所有索引,如下所示。
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() - yamen

0

另一个试图提高效率的例子:

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);
    }
}

0

测试过了。可以工作。但有点傻。

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++;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接