从字符串中删除特殊和无效字符

3

我一直在为第三方公司创建产品数据源。我所使用的数据中存在各种无效字符、特殊字符和双重空格等问题。他们还要求对数据进行HTML编码,其中使用了特殊字符。

以下是一些可能传递的数据示例 = "购买厨房辅助工艺品™搅拌机4.8L"

        try
        {
            var removeDoubleSpace = Regex.Replace(stringInput, @"\s+", " ");
            var encodedString = HttpUtility.HtmlEncode(removeDoubleSpace).Trim();
            var encodedAndLineBreaksRemoved = encodedString.Replace(Environment.NewLine, "");
            var finalStringOutput = Regex.Replace(encodedAndLineBreaksRemoved, @"(™)|(’)|(”)|(–)", "");

            return finalStringOutput;
        }
        catch (Exception)
        {
            return stringInput;
        }

我正在尝试提供一种方法,可以执行上述所有操作,而不是使用多个Regex表达式进行清理。或者,也许存在一种涵盖所有情况的正则表达式吗?


你可以编写一个函数来枚举所提供字符串中的所有字符,并检查每个字符的有效性(或有效性对,即空格问题)。你可以编写它,使其仅枚举所有字符一次,而不是执行多个正则表达式和替换。 - Der Kommissar
1
我的建议是:别费劲了。 如果你成功了,你可能最终会得到一个又长又复杂、难以阅读且基本上是糟糕透顶的正则表达式。除非你面临着可怕的性能问题,否则最好进行2、3甚至10个替换操作,并保持可读性强的代码。 - Zohar Peled
我的示例现在更完整了,并使用白名单剥离所有非ASCII字符。 - Shaun Luttin
3个回答

2
使用白名单而不是黑名单,因为你可以更容易地知道哪些字母是可接受的,而不是可能存在不可接受的字母。白名单就是一个接受字符的列表。创建你的白名单,然后删除不在该列表中的所有内容。在你的情况下,一个潜在的白名单可以包括所有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());
    }
}

输出
Buy Kitchen Aid Artisan Stand Mixer 4.8L

我认为这种方法唯一的问题是我的白名单会很大,而且需要维护。这还要根据将来可能使用的某些字符。谢谢。 - Lee Swainsbury
白名单不需要很大。实际上,它会比黑名单更容易管理。你永远不知道新的黑名单条目会什么时候出现,而这些可能比白名单条目更让你惊讶。 - Shaun Luttin

0

你不需要正则表达式,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

0

这里是稍微改进过的代码:

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+ 正则表达式(\s 匹配任何空格字符,包括空格、制表符、进纸符等。相当于 [ \f\n\r\t\v]。)被删除了。

此外,除非您计划删除某个字符范围或类别(例如所有在 \p{S} 简写类别中的字符),否则无需使用第二个正则表达式。因此,我只是将几个 string.Replace 方法链接到修剪和编码后的字符串上。

输出:

Buy Kitchen Aid Artisan Stand Mixer 4.8L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接