C# 删除字符串中的特殊字符和无效字符
我一直在为第三方公司创建产品提要。我正在处理的数据有各种各样的无效字符、特殊字符、双空格等。他们还要求对数据进行HTML编码,其中使用特殊字符 将要传递的某些数据的示例=“购买厨房” 援助工匠™ 立式搅拌机4.8L“C# 删除字符串中的特殊字符和无效字符,c#,regex,string,C#,Regex,String,我一直在为第三方公司创建产品提要。我正在处理的数据有各种各样的无效字符、特殊字符、双空格等。他们还要求对数据进行HTML编码,其中使用特殊字符 将要传递的某些数据的示例=“购买厨房” 援助工匠™ 立式搅拌机4.8L“ 我试图想出一个可以调用的方法,以一种更干净的方式而不是几个Regex表达式来完成上述所有工作。或者,也许只有一个正则表达式可以涵盖所有内容?使用白名单而不是黑名单,因为您可以更容易地知道哪些字母是可接受的,而不是哪些字母可能是不可接受的。白名单就是这样。这是一个可接受字符的列表。创
我试图想出一个可以调用的方法,以一种更干净的方式而不是几个
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字符的内容。我觉得这种方法的唯一问题是,我的白名单会很大,而且会被覆盖。取决于将来可能使用的某些字符。谢谢,虽然白名单不必太多。事实上,这将比你的黑名单更容易管理。你永远不知道什么时候会出现新的黑名单项目,这些项目比白名单项目更让你吃惊。