8

在我们的应用程序中,用户将数据从 MS word 输入到 asp.net textarea 控件,最后数据保存在 SQL Server 中。出于某种原因,从 SQL Server Management Studio 中查看时,很少有看起来像小方块的垃圾字符。

这会在生成 Crystal Reports 时导致错误。

我需要一个正则表达式,它将删除所有这些字符以及项目符号。唯一有效的输入是

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

此外,制表符空格应替换为单个空格。输入键或换行是允许的。

目前我正在使用

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

但它不会删除项目符号或制表符空格。

任何正则表达式忍者可以帮助我解决这个问题吗?提前致谢。

4

2 回答 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

请注意,后面的 TABárvíztűrő已替换为单个空格。

关于子弹:

我在 Word 中制作了一个项目符号列表并将其复制到网页的文本区域中。然后我保存了 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 Console 以查看项目符号):

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

现在除了 TAB 之外,每行开头的项目符号也被替换为空格。

于 2013-02-13T13:11:02.970 回答
0

我认为您应该诊断潜在问题,而不是说“某种原因”并尝试解决症状,但这不是您的问题:

你会想要这个正则表达式:

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

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

\t

并将其替换为" ".

于 2013-02-13T13:15:40.403 回答