2013-02-13 47 views
8

在我們的應用程序中,用戶正在輸入數據從MS字到asp.net textarea控件,最後數據保存在SQL Server中。由於某些原因,從SQL Server Management Studio查看時,幾乎沒有垃圾字符看起來像小方塊。替換爲正則表達式

這在生成Crystal Reports時會導致錯誤。

我需要一個正則表達式,它會將所有這些字符和子彈一起剝離。唯一有效的輸入是

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

此外,標籤空間應替換爲單個空格。輸入鍵或新行是允許的。

目前我使用

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

,但它不會努力消除子彈或製表符空格。

任何正則表達式忍者都可以幫我解決這個問題嗎?提前致謝。

+0

我知道這並不完全是你想要的,但是如何在'textarea'上啓用所見即所得的編輯器,以便從Word中粘貼選項。 [TinyMCE](http://www.tinymce.com/wiki.php/Plugin:paste)只有這個任務的插件? – Tr1stan 2013-02-13 12:54:31

+0

截至目前,這不是我的選擇。 – NoobDeveloper 2013-02-13 12:55:39

+0

使用'ASCII' SQL函數來找出它到底是什麼字符,我的猜測是你正在尋找錯誤的:http://msdn.microsoft.com/en-us/library/ms177545.aspx – Arran 2013-02-13 13:01:17

回答

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字符,或者把所有的人都爲一個字符集:

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,在每行開頭的子彈也被替換爲空。

+0

非常感謝@kol,因爲用戶正在複製MS詞中的數據,所以我想支持「和」字符。我如何將它添加到上面的正則表達式。我嘗試添加這些字符,但它不會按預期過濾。任何關於此的幫助都非常受歡迎。再次感謝。 – NoobDeveloper 2013-02-14 10:26:24

+0

不客氣。我認爲「和」可以作爲Unicode字符轉義序列添加到有效字符集中,我會嘗試\ u2018- \ u201f,在這裏看到:http://www.techabulary.com/u/unicode/ – kol 2013-02-14 11:01:20

0

我認爲你應該診斷潛在的問題,而不是說「某種原因」,並試圖修復的症狀,但是這不是你的問題:

你會想這個表達式:

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

要匹配任何不允許的字符,然後您想用String.Empty替換它。然後你只想匹配:

\t 

並用" "替換它。

+1

你不需要在'[]'中除了'[]'以外的任何東西都可以轉義] – Anirudha 2013-02-13 13:24:07

+0

絕對是不真實的。嘗試使用正則表達式[\ s]反對「s」。通過您的邏輯,正則表達式匹配反斜槓或s,但您會發現它實際上匹配任何空格字符。另外,當您編輯某人的帖子時,請確保您的編輯不會更改答案並使其無效。 – 2013-02-13 13:54:58