在C#中替换字符串的连续实例

时间:2015-02-05 12:31:41

标签: c# regex

如何在C#中替换字符串的连续子字符串? 例如,字符串

"<p>The&nbsp;&nbsp;&nbsp;quick&nbsp;&nbsp;&nbsp;fox</p>"

将转换为

"<p>The&nbsp;quick&nbsp;fox</p>"

3 个答案:

答案 0 :(得分:3)

使用以下正则表达式

@"(.+)\1+"

(.+)捕获字符组并匹配以下\1+一组或多组相同的字符。

然后将匹配替换为$1

DEMO

string result = Regex.Replace(str, @"(.+)\1+", "$1");

答案 1 :(得分:2)

也许这个简单就足够了:

(&nbsp;){2,}

并替换为$1&nbsp;在第一个括号内组中捕获的内容)

请参阅test at regex101


要检查子串是否跟随自身,还可以使用lookahead

(?:(&nbsp;)(?=\1))+

并替换为空。见test at regex101.com

答案 2 :(得分:2)

让我们调用原始字符串s和子字符串subString

    var s = "<p>The&nbsp;&nbsp;&nbsp;quick&nbsp;&nbsp;&nbsp;fox</p>";
    var subString = "&nbsp;";

我更喜欢这个而不是正则表达式,更具可读性:

    var subStringTwice = subString + subString;

    while (s.Contains(subStringTwice))
    {
        s = s.Replace(subStringTwice, subString);
    }

具有更好性能的另一种可能的解决方案:

    var elements = s.Split(new []{subString}, StringSplitOptions.RemoveEmptyEntries);
    s = string.Join(subString, elements);
    // This part is only needed when subString can appear at the start or the end of s
    if (result != "")
    {
        if (s.StartsWith(subString)) result = subString + result;
        if (s.EndsWith(subString)) result = result + subString;                
    }