删除字符串中的类似字符

时间:2009-12-22 14:47:09

标签: c# string

是否有任何内置方法可以删除字符串中的相似字符? 例子:

aaaabbbccc ->  abc
aabbccaa -> abc

由于

6 个答案:

答案 0 :(得分:6)

您可以使用HashSet并为此构建扩展方法:

    static string RemoveDuplicateChars(this string s)
    {
        HashSet<char> set = new HashSet<char>();
        StringBuilder sb = new StringBuilder(s.Length);

        foreach (var c in s)
        {
            if (set.Add(c))
            {
                sb.Append(c);
            }
        }

        return sb.ToString();
    }

或使用Enumerable.Distinct,只需:

Console.WriteLine(new string("aaabbbccaddcacc".Distinct().ToArray()));

答案 1 :(得分:6)

这样的事情可以解决你的问题吗?

string distinct = new string("aaaabbbccc".Distinct().ToArray());

这有点难看,但你可以把它包装成扩展方法:

public static string UniqueChars(this string original)
{
    return new string(original.Distinct().ToArray());
}

希望这有帮助。

答案 2 :(得分:1)

使用Regex类:

Regex.Replace( "aaabbcc", @"(\w)\1+", "$1" )

将导致

abc

有关更多信息,请here

修改
由于我编辑了你的问题:

Regex.Replace( "acaabbccbaa", @"(\w)(?<=\1.+)", "" )

将导致

acb

此模式使用负面的lookbehind来识别双重字符并将其替换为""

答案 3 :(得分:0)

我原本以为你想看看使用正则表达式。对于C#.NET,这是一个有用的网站...

http://www.regular-expressions.info/dotnet.html

答案 4 :(得分:0)

没有

但是可以很容易地在一个循环中进行,记住你需要构建一个新的字符串,你不能在现有的字符串中编辑一个字符串(你可以做string.remove,但很可能会很慢并弄乱你的循环)。

basicly:

for(int i=0;i<MyText.Length;i++)
{
   if(i == 0)
     contiune;

   if(Text[i] == Text[i - 1])
       // Do something, both chars are the same
}

答案 5 :(得分:0)

由于您特别询问有关删除“类似”字符的问题,您可能需要尝试以下内容:

using System.Globalization;
....
        private string RemoveDuplicates(string text)
        {
            StringBuilder result = new StringBuilder();
            string previousTextElement = string.Empty;
            TextElementEnumerator textElementEnumerator = StringInfo.GetTextElementEnumerator(text);
            textElementEnumerator.Reset();
            while (textElementEnumerator.MoveNext())
            {
                string textElement = (string)textElementEnumerator.Current;
                if (string.Compare(previousTextElement, textElement, CultureInfo.InvariantCulture,
                    CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace |
                    CompareOptions.IgnoreWidth) != 0)
                {
                    result.Append(textElement);
                    previousTextElement = textElement;
                }
            }
            return result.ToString();
        }