如何使用正则表达式查找字符串中Char的前x次出现

本文关键字:的前 Char 何使用 正则表达式 查找 字符串 | 更新日期: 2023-09-27 18:06:01

我正试图找出如何在字符串中获得Char的前x匹配。我尝试使用Matchcollection,但我找不到任何转义序列在x' -match之后停止。

供参考:我需要这对于一个字符串的可变长度和不同数量的搜索字符的出现,所以只是得到所有和只使用第一个x不是一个解决方案。

Thanks in advance

编辑:我使用蒸汽阅读器从。txt文件中获取信息并将其写入属性,每个文件一个字符串。这些环的长度差别很大。每个字符串中有3个关键字。但有时出了问题,我只有一两个关键字。关键字之间是用;分隔的其他字段。因此,如果我使用Matchcollection来获取;'s的索引,并且缺少一个关键字,则文件中的信息被转移。因此,我需要找到(现有)关键字之前/之后的前x次出现。

如何使用正则表达式查找字符串中Char的前x次出现

你真的想使用Regex吗?像这样的东西是不行的?

string simpletext = "Hello World";
int firstoccur = simpletext.IndexOfAny(new char[]{'o'});

由于您想要该字符的所有索引,您可以尝试以这种方式

string simpletext = "Hello World";
int[] occurences = Enumerable.Range(0, simpletext.Length).Where(x => simpletext[x] == 'o').ToArray();

可以使用Match类。该类只返回一个结果,但是您可以遍历字符串,直到找到最后一个。

像这样:

Match match = Regex.Match(input, pattern);
int count = 0;
while (match.Success)
{
    count++;
    // do something with match
    match = match.NextMatch();
    // Exit the loop when your match number is reached
}

如果你决定使用Regex,那么我会用Matches来做这个,而不是Match;很大程度上是因为你提前得到了计数。

string pattern = "a";
string source = "this is a test of a regex match";
int maxMatches = 2;
MatchCollection mc = Regex.Matches(source, pattern);
if (mc.Count() > 0)
{
  for (int i = 0; i < maxMatches; i++) 
  {
    //do something with mc[i].Index, mc[i].Length
  }
}

拆分操作非常快,所以如果不需要正则表达式,可以使用:

public static IEnumerable<int> IndicesOf(this string text, char value, int count)
        {
            var tokens = text.Split(value);
            var sum = tokens[0].Length;
            var currentCount = 0;
            for (int i = 1; i < tokens.Length && 
                            sum < text.Length && 
                            currentCount < count; i++)
            {
                yield return sum;
                sum += 1 + tokens[i].Length;
                currentCount++;
            }
        }

的执行时间大约是正则表达式

的60%