无法删除字符串中的一组字符

时间:2012-06-15 15:11:31

标签: c# regex

我想从字符串中删除一组字符:"/\[]:|<>+=;,?*'@

我正在尝试:

private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";

private string Clean(string stringToClean)
{
    return Regex.Replace(stringToClean, "[" + Regex.Escape(CHARS_TO_REPLACE) + "]", "");
}

但是,结果与输入完全相同,如"Foo, bar and other"

我的代码有什么问题?

this question看起来很多,但是使用黑名单而不是白名单列表,所以我删除了^字符中的not。

7 个答案:

答案 0 :(得分:5)

您没有逃离CHARS_TO_REPLACE

中的结束方括号

答案 1 :(得分:3)

如上所述(但答案突然消失),Regex.Escape无法逃脱],因此您需要调整代码:

    return Regex.Replace(stringToClean, "[" + Regex.Escape(CHARS_TO_REPLACE)
          .Replace("]", @"\]") + "]", " ");

答案 2 :(得分:3)

问题是对Regex.Escape如何运作的误解。来自MSDN:

  

通过将其替换为转义码来转义一组最小字符(\,*,+,?,|,{,[,(,),^,$ ,.,#和空格)。

它按预期工作,但您需要将Regex.Escape视为转义字符类之外的元字符。当您使用字符类时,您想要转义内部的内容是不同的。例如,字符类-内部应该转义为文字,否则它可以作为一系列字符(例如[A-Z])。

在您的情况下,正如其他人所提到的,]未被转义。对于在字符类中具有特殊含义的任何字符,您需要在调用Regex.Escape后单独处理它们。这应该做你需要的:

string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";
string pattern = "[" + Regex.Escape(CHARS_TO_REPLACE).Replace("]", @"\]") + "]";

string input = "hi\" there\\ [i love regex];@";
string result = Regex.Replace(input, pattern, "");
Console.WriteLine(result);

否则,您最终得到的["/\\\[]:\|<>\+=;,\?\*'@]没有]转义,所以它真的是["/\\\[]作为一个字符类,然后:\|<>\+=;,\?\*'@]作为模式的其余部分,除非你的字符串与那些剩余的字符完全匹配,否则它们将不匹配。

答案 3 :(得分:1)

CHARS_TO_REPLACE中有许多字符是Regex的特殊字符,需要使用斜杠\进行转义。

这应该有效:

"/\[]:\|<>\+=;,\?\*'@

答案 4 :(得分:1)

为什么不这样做:

 private static string Clean(string stringToClean)
    {

        string[] disallowedChars = new string[] {//YOUR CHARS HERE};

        for (int i = 0; i < disallowedChars.Length; i++)
        {
            stringToClean= stringToClean.Replace(disallowedChars[i],""); 
        }

        return stringToClean;
    }

答案 5 :(得分:1)

单语句linq解决方案:

private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";

private string Clean(string stringToClean) {
    return CHARS_TO_REPLACE
        .Aggregate(stringToClean, (str, l) => str.Replace(""+l, ""));
}

答案 6 :(得分:0)

为了便于了解,这里有一个适用于非常大的字符串(甚至是流)的变体。这里没有正则表达式,只需在每个字符上循环一个字符串构建器来存储结果:

class Program
{
    private const string CHARS_TO_REPLACE = @"""/\[]:|<>+=;,?*'@";

    static void Main(string[] args)
    {
        var wc = new WebClient();
        var veryLargeString = wc.DownloadString("http://msdn.microsoft.com");

        using (var sr = new StringReader(veryLargeString))
        {
            var sb = new StringBuilder();

            int readVal;
            while ((readVal = sr.Read()) != -1)
            {
                var c = (char)readVal;
                if (!CHARS_TO_REPLACE.Contains(c))
                {
                    sb.Append(c);
                }
            }

            Console.WriteLine(sb.ToString());
        }
    }
}