使用RegEx从字符串中删除特殊字符

时间:2018-01-09 19:36:39

标签: c# regex special-characters

在阅读包含字词,数字和特殊字符的文字文件时,我想删除某些特殊字符,例如:[](),'

我有这段代码,但它无效!

using (var reader = new StreamReader ("C://Users//HP//Documents//result2.txt")) {
            string line = reader.ReadToEnd ();

            Regex rgx = new Regex ("[^[]()',]");
            string res = rgx.Replace (line, "");
            Message1.text = res;

        }

我错过了什么,谢谢

4 个答案:

答案 0 :(得分:3)

正则表达式中的某些字符,特别是[ ] ( ) ^,持有special meaning in Regex,为了在字面上使用它们,必须将它们转义。

使用以下正确转义的Regex:

Regex rgx = new Regex (@"[\^\[\]\(\)',]");

请注意,必须使用@逐字字符串,因为我们不想从字符串中转义这些字符,只能从正则表达式中转义。

或者,双重逃避反斜杠:

Regex rgx = new Regex ("[\\^\\[\\]\\(\\)',]");

但在这种情况下,这种可读性较差。

答案 1 :(得分:1)

您可以跳过正则表达式并只保留要删除的字符列表,然后替换旧方式:

string[] specialCharsToRemove = new [] { "[", "]", "(", ")", "'", "," };

using (var reader = new StreamReader ("C://Users//HP//Documents//result2.txt")) 
{
    string line = reader.ReadToEnd();
    foreach(string s in specialCharsToRemove)
    {
        line = line.Replace(s, string.Empty);
    } 
    Message1.text = res;            
}

理想情况下,这将采用自己的方法,如下所示:

private static string RemoveCharacters(string input, string[] specialCharactersToRemove)
{
    foreach(string s in specialCharactersToRemove)
    {
        input = input.Replace(s, string.Empty);
    }
    return input;
}

我做了一个小提琴here

答案 2 :(得分:0)

使用String.Replace:

一次替换它们
using (var reader = new StreamReader ("C://Users//HP//Documents//result2.txt")) 
{
        string line = reader.ReadToEnd ();

        string res = line.Replace(line, "[", "");
        res  = res.Replace(line, "]", "");
        res  = res.Replace(line, "(", "");
        res  = res.Replace(line, ")", "");
        res  = res.Replace(line, "'", "");
        res  = res.Replace(line, ",", "");
        Message1.text = res;

    }

答案 3 :(得分:0)

我同意避免使用正则表达式,但我也不会多次使用string.Replace。

考虑实现一个Replace或Remove方法,该方法接受要替换的字符数组,并仅扫描输入字符串一次。例如:

var builder = new StringBuilder();

foreach (char ch in input)
{
    if (!chars.Contains(ch))
    {
        builder.Append(ch):
    }
}

return builder.ToString();