在 C# 中查找较大字符串中子字符串的所有位置
问题:
给定一个大字符串,您需要识别并存储指定子字符串所有出现的位置在该字符串内。例如,如果子字符串是“extract”(me,i-have much.of]punctuation”出现在较大字符串的开头和中间,则应找到两个实例并将它们的索引位置添加到列表中,从而产生包含 0 和中间出现的索引的列表。
解决方案:
提供的代码利用 IndexOf 方法,该方法可以用于定位字符串中第一次出现的子字符串,但是,此方法仅返回第一个匹配项,可以使用循环从上一个匹配项之后的位置开始重复调用 IndexOf,直到不再有匹配项。然后可以将索引位置添加到所需的列表中。
这是所提供的更正版本代码:
List<int> inst = new List<int>(); int index = 0; while (index < source.Length) { int src = source.IndexOf("extract\"(me,i-have lots. of]punctuation", index); if (src == -1) break; // No more occurrences found inst.Add(src); index = src + 40; // Advance the search index to beyond the current match }
替代方法:
另一种解决方案涉及使用扩展方法以提供更大的便利,这是一个利用迭代器模式的示例扩展方法:
public static IEnumerable<int> AllIndexesOf(this string str, string value) { if (String.IsNullOrEmpty(value)) throw new ArgumentException("the string to find may not be empty", "value"); for (int index = 0;; index += value.Length) { index = str.IndexOf(value, index); if (index == -1) break; yield return index; } }
使用此扩展方法,您可以轻松找到子字符串的所有出现位置:如下:
List<int> indexes = "fooStringfooBar".AllIndexesOf("foo");
以上是如何在 C# 中查找字符串中子字符串的所有出现位置?的详细内容。更多信息请关注PHP中文网其他相关文章!