8

このアプリケーションでは、ユーザーが MS Word から asp.net テキストエリア コントロールにデータを入力し、最終的にデータが SQL Server に保存されます。何らかの理由で、SQL Server Management Studio から見ると小さな四角のように見えるジャンク文字がほとんどありません。

これにより、Crystal Reports の生成中にエラーが発生します。

そのようなすべての文字を箇条書きとともに取り除く正規表​​現が必要です。唯一の有効な入力は

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

また、タブ スペースは単一のスペースに置き換える必要があります。Enter キーまたは改行が許可されます。

現在、私は使用しています

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

ただし、箇条書きやタブ スペースを削除することはできません。

正規表現忍者はこの問題を解決できますか? 前もって感謝します。

4

2 に答える 2

3

2 つの正規表現を使用できます。1 つ目は、パターン"\t|<bullet>"(<bullet>は箇条書きの表現を表します) を使用して、TAB と箇条書きをスペース ( " ") に置き換えます。2 番目のパターンは、有効な文字のリストを含む否定された文字セットであり、2 番目に使用され、無効な文字を空の文字列 ( "") に置き換えます。つまり、無効な文字を取り除きます。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 で箇条書きリストを作成し、それを Web ページのテキスト領域にコピーしました。次に、HTML を保存したところ、箇条書きが UTF-8 でエンコードされた文字として保存されていることがわかりましたE280A2。これは、「弾丸の表現」の上で私が呼んだものです。可能性のある箇条書き文字のバイナリ表現を見つけ出し、それらを最初のパターンに追加する必要があります。それらをタブ文字に 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 に加えて、各行の先頭の箇条書きもスペースに置き換えられました。

于 2013-02-13T13:11:02.970 に答える
0

「何らかの理由で」と言って症状を修正しようとするのではなく、根本的な問題を診断する必要があると思いますが、それはあなたの質問ではありません。

この正規表現が必要になります:

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

許可されていない文字と一致させるには、それを。に置き換えますString.Empty。次に、一致させたいだけです。

\t

そして、それを。に置き換え" "ます。

于 2013-02-13T13:15:40.403 に答える