正则表达式删除特定的重复字符

时间:2011-02-24 23:44:10

标签: c# regex

我想在C#中创建一个正则表达式,如果它被重复则删除一个特定的字符,因此它不是字符串的最后一个字符。

示例:

"a--b-c-" => "a-b-c"
"-a-b--c" => "a-b-c"
"--a--b--c--" => "a-b-c"

我从不想要 - 重复,我从不希望它成为我的字符串的第一个或最后一个字符。我怎么能写一个正则表达式呢?

5 个答案:

答案 0 :(得分:16)

可能最容易分两步完成。首先用一个“ - ”替换一个或多个“ - ”的每个匹配项,然后修剪任何前导/尾随“ - ”。

var reducedString = Regex.Replace(inputString, "-+", "-");

var finalString = reducedString.Trim('-');

答案 1 :(得分:6)

对于这个特定的问题,我可能不会使用正则表达式。相反,我可能会使用String.SplitString.Join的组合,这会更简单,也可能更快:

像这样:

string.Join("-", s.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries));

通过测试:

using System;
class Program
{
    static string RemoveDashes(string s)
    {
        return string.Join("-", s.Split(new char[] { '-' }, 
                            StringSplitOptions.RemoveEmptyEntries));
    }
    static void Main(string[] args)
    {
        Tuple<string, string>[] tests = new Tuple<string,string> [] 
        {
            new Tuple<string, string> ("a--b-c-", "a-b-c"),
            new Tuple<string, string> ("-a--b-c-", "a-b-c"),
            new Tuple<string, string> ("--a--b--c--", "a-b-c"),
        };
        foreach (var t in tests)
        {
            string s = RemoveDashes(t.Item1);
            Console.WriteLine("{3}: {0} => Expected: {1}, Actual: {2}", 
                        t.Item1, t.Item2, s, s == t.Item2 ? "PASS" : "FAIL");
        }
    }
}

答案 2 :(得分:3)

string tidyText = Regex.Replace(originalText, "^-+|(?<=-)-+|-+$", "");

答案 3 :(得分:1)

我知道你要求Regex,但是第二个你需要改变或重新阅读的代码,大多数人只是重写它,因为它比重新学习代码所做的更快。使用内置字符串方法的2行将比重新读取未来的正则表达式容易得多。在某些情况下它会更快。

        string text = "--a-b--c-";
        text = text.Replace( "--", "-" );
        text = text.Trim( '-' );

答案 4 :(得分:0)

如果没有正则表达式,这可能更容易实现。类似于以下内容(未经测试):

string s = "--a--b--c--";
string t = "";

bool atStart = true;
bool inHyphen = false;

foreach (char c in s) {
    if (c != "-") {
        if (atStart) {
            atStart = false;
        } else if (inHyphen) {
            inHyphen = false;
            t += "-";
        }
        t += c;
    } else {
        inHyphen = true;
    }
}