在我们的应用程序中,用户正在从MS word输入数据到asp.net textarea控件,最后数据保存在SQL Server中。出于某种原因,从SQL Server Management Studio查看时,几乎没有垃圾字符看起来像小方块。
这会在生成Crystal Reports时导致错误。
我需要一个正则表达式,它会删除所有这些字符和子弹。唯一有效的输入是
A-Z, a-z , 0-9, ~ ! @ # % $ ^ & * ( ) _ + | ` - = \ {}:">? < [ ] ; ' , . /
此外,标签空间应替换为单个空格。允许输入键或新行。
目前我正在使用
Regex.Replace(data, @"[^\u0000-\u007F]", " ");
但删除项目符号或制表符空格无效。
任何正则表达式忍者都可以帮我解决这个问题吗?提前致谢。
答案 0 :(得分:3)
您可以使用两个正则表达式。首先使用模式"\t|<bullet>"
(其中<bullet>
代表项目符号的表示),用空格(" "
)替换TAB和项目符号。第二个,其模式是包含有效字符列表的否定字符集,第二个用于将无效字符替换为空字符串(""
),即删除它们。由于您需要保留CR和LF字符(和空格),因此必须将这些字符添加到有效字符集中:
using System;
using System.Text.RegularExpressions;
static class Program
{
public static void Main()
{
string pattern1 = @"\t";
Regex regex1 = new Regex(pattern1, RegexOptions.Compiled);
string pattern2 = @"[^A-Za-z0-9~!#$^&*()_+|`\-=\\{}:"">?<\[\];',./ \r\n]";
Regex regex2 = new Regex(pattern2, RegexOptions.Compiled);
string input = "ABZabz09~!#$^&*()_+|`-=\\{}:\">?<[];',./ \r\nárvíztűrő\ttükörfúrógép";
string temp = regex1.Replace(input, " ");
string output = regex2.Replace(temp, "");
Console.WriteLine(input);
Console.WriteLine(output);
Console.ReadKey(true);
}
}
输出:
ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
árvíztűrő tükörfúrógép
ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
rvztr tkrfrgp
请注意,árvíztűrő
之后的TAB被替换为单个空格。
关于子弹:
我在Word中创建了一个项目符号列表,并将其复制到网页中的textarea中。然后我保存了HTML并发现子弹被保存为UTF-8编码的字符E280A2
。这就是我在上面所说的“子弹的代表”。你应该弄清楚可能的子弹字符的二进制表示,并将它们添加到第一个模式:或者将它们与TAB字符对应,或者将它们全部放入字符集中:
using System;
using System.Text;
using System.Text.RegularExpressions;
static class Program
{
public static void Main()
{
byte[] bulletBytes = new byte[] { 0xE2, 0x80, 0xA2 };
string bullet= Encoding.UTF8.GetString(bulletBytes);
string pattern1 = @"[\t" + bullet + "]";
Regex regex1 = new Regex(pattern1, RegexOptions.Compiled);
string pattern2 = @"[^A-Za-z0-9~!#$^&*()_+|`\-=\\{}:"">?<\[\];',./ \r\n]";
Regex regex2 = new Regex(pattern2, RegexOptions.Compiled);
string input =
bullet + "ABZabz09~!#$^&*()_+|`-=\\{}:\">?<[];',./ \r\n" +
bullet + "árvíztűrő\ttükörfúrógép";
string temp = regex1.Replace(input, " ");
string output = regex2.Replace(temp, "");
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(input);
Console.WriteLine(output);
Console.ReadKey(true);
}
}
输出(您应该将控制台字体更改为Lucida控制台以查看子弹):
•ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
•árvíztűrő tükörfúrógép
ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
rvztr tkrfrgp
现在除了TAB之外,每行开头的子弹也被替换为空格。
答案 1 :(得分:0)
我认为您应该诊断潜在的问题,而不是说“某种原因”并尝试修复症状,但这不是您的问题:
你会想要这个正则表达式:
[^A-Za-z0-9~!\#\$\^&\*\(\)_\+\|`\-\=\\\{\};"\>\?\<\[\]:',\.\/]
要匹配任何不允许的字符,然后您需要将其替换为String.Empty
。然后你只想匹配:
\t
并将其替换为" "
。