C# 删除字符串中的特殊字符和无效字符

C# 删除字符串中的特殊字符和无效字符,c#,regex,string,C#,Regex,String,我一直在为第三方公司创建产品提要。我正在处理的数据有各种各样的无效字符、特殊字符、双空格等。他们还要求对数据进行HTML编码,其中使用特殊字符 将要传递的某些数据的示例=“购买厨房” 援助工匠™ 立式搅拌机4.8L“ 我试图想出一个可以调用的方法,以一种更干净的方式而不是几个Regex表达式来完成上述所有工作。或者,也许只有一个正则表达式可以涵盖所有内容?使用白名单而不是黑名单,因为您可以更容易地知道哪些字母是可接受的,而不是哪些字母可能是不可接受的。白名单就是这样。这是一个可接受字符的列表。创

我一直在为第三方公司创建产品提要。我正在处理的数据有各种各样的无效字符、特殊字符、双空格等。他们还要求对数据进行HTML编码,其中使用特殊字符

将要传递的某些数据的示例=“购买厨房”

援助工匠™ 立式搅拌机4.8L“


我试图想出一个可以调用的方法,以一种更干净的方式而不是几个
Regex
表达式来完成上述所有工作。或者,也许只有一个正则表达式可以涵盖所有内容?

使用白名单而不是黑名单,因为您可以更容易地知道哪些字母是可接受的,而不是哪些字母可能是不可接受的。白名单就是这样。这是一个可接受字符的列表。创建您的白名单,并删除所有不在该名单上的内容。在您的情况下,潜在的白名单可能包括所有ASCII字符

using System;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{       
    private static string input = @"Buy Kitchen

Aid Artisan™ Stand Mixer 4.8L ";

    public static void Main()
    {
        var match = Regex
            .Match(input, @"[a-zA-Z0-9\p{P}]+");

        StringBuilder builder = new StringBuilder();
        while(match.Success)
        {
            // add a space between matches
            builder.Append(match + " ");
            match = match.NextMatch();
        }
        Console.WriteLine(builder.ToString());
    }
}
所有字母数字和标点符号字符

using System;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{       
    private static string input = @"Buy Kitchen

Aid Artisan™ Stand Mixer 4.8L ";

    public static void Main()
    {
        var match = Regex
            .Match(input, @"[a-zA-Z0-9\p{P}]+");

        StringBuilder builder = new StringBuilder();
        while(match.Success)
        {
            // add a space between matches
            builder.Append(match + " ");
            match = match.NextMatch();
        }
        Console.WriteLine(builder.ToString());
    }
}
输出

Buy Kitchen Aid Artisan Stand Mixer 4.8L

下面是一段增强的代码:

var removeDoubleSpace = Regex.Replace(stringInput, @"\s+", " ");
var encodedString = System.Web.HttpUtility.HtmlEncode(removeDoubleSpace).Trim().Replace("™", string.Empty).Replace("’", string.Empty).Replace("”", string.Empty).Replace("–", string.Empty);
您不需要使用
var encodedAndLineBreaksRemoved=encodedString.Replace(Environment.NewLine,”)\s
匹配任何空格字符,包括空格、制表符、换行符等。相当于[\f\n\r\t\v])

此外,没有必要使用第二个正则表达式,除非您计划删除特定范围的字符或类(例如
\p{S}
速记类中的所有字符),因此,我只链接了几个
字符串。替换
方法,直接到修剪和编码的字符串

输出:

Buy Kitchen Aid Artisan Stand Mixer 4.8L

您不需要正则表达式,linq也可以:

var str = "Buy Kitchen Aid Artisan™ Stand Mixer 4.8L";
var newStr = new string(str.Where(c => !Char.IsSymbol(c)).ToArray());

Console.WriteLine(newStr); // Buy Kitchen Aid Artisan Stand Mixer 4.8L

您可以编写一个函数,枚举所显示字符串中的所有字符,并检查每个字符的有效性(或有效性对,即您的空格问题)。您可以编写该函数,使其只枚举所有字符一次,而不是执行多个正则表达式和替换。我的2美分:不用麻烦了。如果你成功了,你可能会得到一个长的,复杂的,难以阅读的,基本上是一个糟糕的正则表达式。最好执行2、3、甚至10个替换操作并保留可读代码,除非您面临严重的性能问题。我的示例现在更加完整,并使用白名单删除了所有不是ASCII字符的内容。我觉得这种方法的唯一问题是,我的白名单会很大,而且会被覆盖。取决于将来可能使用的某些字符。谢谢,虽然白名单不必太多。事实上,这将比你的黑名单更容易管理。你永远不知道什么时候会出现新的黑名单项目,这些项目比白名单项目更让你吃惊。