使用正则表达式进行替换

8
在我们的应用程序中,用户从MS Word输入数据到asp.net文本区域控件中,最终数据保存在SQL Server中。由于某些原因,在从SQL Server Management Studio查看时,会出现一些看起来像小方块的垃圾字符。
这会导致生成Crystal Reports时出错。
我需要一个正则表达式,可以除去所有这样的字符以及项目符号。唯一有效的输入是:
A-Z, a-z , 0-9, ~ ! @ # % $ ^ & *  ( ) _ + | ` - = \ {}:">? < [ ] ; ' , . /

此外,制表符应该替换为单个空格。可以使用回车键或换行符。

目前我正在使用

Regex.Replace(data, @"[^\u0000-\u007F]", " ");

但是它无法删除项目符号或制表符。

有没有正则表达式高手可以帮我解决这个问题?提前感谢。


我知道这不完全是你想要的,但在textarea上启用一个所见即所得编辑器,并提供从Word粘贴的选项如何?TinyMCE有一个专门处理此任务的插件。 - Tr1stan
目前对我来说这不是一个选项。 - NoobDeveloper
使用 ASCII SQL 函数来确定它是哪个字符,我猜你可能找错了:http://msdn.microsoft.com/en-us/library/ms177545.aspx - Arran
请查看regex - Finding tabs or 4 spaces。项目符号是ASCII字符,因此您可以将它们复制到您的正则表达式模式中并进行替换。 - Bob.
2个回答

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中制作了一个项目符号列表,并将其复制到网页文本区域中。然后我保存了HTML并发现项目符号被保存为UTF-8编码的字符 E280A2。这就是我上面所说的“项目符号的表示方式”。您应该找出可能的项目符号字符的二进制表示,并将它们添加到第一个模式中:要么将它们与TAB字符进行OR运算,要么将它们全部放入一个字符集中。
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 Console以查看子弹点):

•ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
•árvíztűrő      tükörfúrógép
 ABZabz09~!#$^&*()_+|`-=\{}:">?<[];',./
 rvztr tkrfrgp

现在除了TAB,每行开头的圆点也被替换成了一个空格。

非常感谢@kol,由于用户正在从MS Word复制数据,我想支持“和‘字符。我该如何将其添加到上面的正则表达式中?我尝试将这些字符直接添加,但它不会按预期进行过滤。对此的任何帮助都将不胜感激。再次感谢。 - NoobDeveloper
不客气。我认为双引号和单引号可以作为有效字符加入Unicode字符转义序列的集合中。我建议尝试\u2018-\u201f,详见此链接:http://www.techabulary.com/u/unicode/ - kol

0

我认为你应该诊断潜在的问题,而不是说“某些原因”并试图修复症状,但这不是你的问题:

你需要这个正则表达式:

 [^A-Za-z0-9~!\#\$\^&\*\(\)_\+\|`\-\=\\\{\};"\>\?\<\[\]:',\.\/]

为匹配任何不允许的字符,您需要将其替换为String.Empty。然后您只需匹配:

\t

并将其替换为" "


1
你不需要在 [] 中转义任何内容,除了 [] - Anirudha
绝对不是真的。尝试在“s”上使用正则表达式[\s]。按照您的逻辑,正则表达式匹配反斜杠或s,但实际上它实际上匹配任何空格字符。此外,在编辑某人的帖子时,请确保您的编辑不会改变答案并使其无效。 - Robert Allan Hennigan Leahy

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