如何使用正则表达式查找字符串中Char的前x次出现
本文关键字:的前 Char 何使用 正则表达式 查找 字符串 | 更新日期: 2023-09-27 18:06:01
我正试图找出如何在字符串中获得Char的前x匹配。我尝试使用Matchcollection,但我找不到任何转义序列在x' -match之后停止。
供参考:我需要这对于一个字符串的可变长度和不同数量的搜索字符的出现,所以只是得到所有和只使用第一个x不是一个解决方案。
Thanks in advance
编辑:我使用蒸汽阅读器从。txt文件中获取信息并将其写入属性,每个文件一个字符串。这些环的长度差别很大。每个字符串中有3个关键字。但有时出了问题,我只有一两个关键字。关键字之间是用;分隔的其他字段。因此,如果我使用Matchcollection来获取;'s的索引,并且缺少一个关键字,则文件中的信息被转移。因此,我需要找到(现有)关键字之前/之后的前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++;
}
}
的执行时间大约是正则表达式