如何在字符串中查找特定句子的所有出现?

假设我有一个这样的字符串:

string source = "Today is friday! I'm am having trouble programming this. Today is friday! Tomorrow is saturday. Today is friday!" 

我想搜索这个字符串,抓住所有句子,说“今天是星期五!”,然后用我刚发现的句子创建一个新的字符串。

上述字符串的预期结果是:

 string output = "Today is friday!Today is friday!Today is friday!" 

编辑:LINQ不是强制性的。

谢谢!

这是一个非LINQ方法:

 string str = "Today is friday! I'm am having trouble programming this. Today is friday! Tomorrow is saturday. Today is friday!"; StringBuilder sb = new StringBuilder(); int index = 0; do { index = str.IndexOf("Today is friday!", index); if (index != -1) { sb.Append("Today is friday!"); index++; } } while (index != -1); string repeats = sb.ToString(); 

实际上没有必要找到比赛。 由于您是基于搜索模式创建新字符串,因此只需计算搜索字符串的出现次数就足够了。 如果您愿意,可以使用更快的子字符串计数算法替换正则表达式。

 string source = "Today is friday! I'm am having trouble programming this. Today is friday! Tomorrow is saturday. Today is friday!"; string searchPattern = "Today is friday!"; int count = Regex.Matches(source, searchPattern).Count; string result = string.Concat(Enumerable.Repeat(searchPattern, count)); 

正则表达式

找:

 .*?(Today is friday).*?(?=\1|$) 

更换:

 $1 

说明

 .*? # match everything before an occurrence of the sentence (Today is friday!) # match the sentence .*? # match everything after the sentence... (?=\1|$) # ...up to the next occurrence or end of the string 

好吧,你需要做的第一件事就是把你的一个字符串变成很多。 String.Split()应该在这里工作,不需要正则表达式:

 var sentences = inputString.Split('.','!'); 

一旦你有了单独的句子,你只需要找到符合标准的句子:

 var todayIsFridaySentences = sentences.Where(s=>s.Contains("Today is friday")); 

……最后把它们放回原处; 如果你绝对必须使用Linq:

 var ouputString = todayIsFridaySentences .Aggregate(new StringBuilder(), (s,b) => b.Append(s)) .ToString();