2013-02-13 37 views
8

Trong ứng dụng của chúng tôi, người dùng đang nhập dữ liệu từ MS từ vào điều khiển văn bản asp.net và cuối cùng dữ liệu được lưu trong SQL Server. Đối với một số lý do, có vài ký tự rác trông giống như hình vuông nhỏ khi xem từ SQL Server Management Studio.Thay thế bằng Regex

Điều này gây ra lỗi khi tạo Báo cáo tinh thể.

Tôi cần một regex sẽ loại bỏ tất cả các ký tự đó cùng với dấu đầu dòng. Dữ liệu nhập hợp lệ duy nhất là

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

Ngoài ra, không gian tab phải được thay thế bằng một dấu cách. Nhập khóa hoặc Dòng mới được cho phép.

Hiện nay tôi đang sử dụng

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

nhưng nó sẽ không làm việc để loại bỏ đạn hoặc các không gian tab.

Có thể bất kỳ ninja regex nào giúp tôi khắc phục sự cố này không? Cảm ơn trước.

+0

Tôi biết nó không chính xác những gì bạn đang làm, nhưng làm thế nào về việc cho phép một trình soạn thảo WYSIWYG trên 'textarea' cung cấp một tùy chọn để dán từ Word. [TinyMCE] (http://www.tinymce.com/wiki.php/Plugin:paste) có một plugin chỉ cho tác vụ này? – Tr1stan

+0

Đó không phải là một lựa chọn cho tôi kể từ bây giờ. – NoobDeveloper

+0

Sử dụng hàm SQL 'ASCII' để tìm ra chính xác ký tự đó là gì, tôi đoán là bạn đang tìm kiếm một ký tự sai: http://msdn.microsoft.com/en-us/library/ms177545.aspx – Arran

Trả lời

3

Bạn có thể sử dụng hai regex. Đầu tiên, với mẫu "\t|<bullet>" (trong đó <bullet> là viết tắt của biểu diễn viên đạn) được sử dụng trước tiên, để thay thế TAB và dấu đầu dòng bằng dấu cách (" "). Thứ hai, mẫu là bộ ký tự phủ định chứa danh sách các ký tự hợp lệ của bạn, được sử dụng thứ hai, để thay thế các ký tự không hợp lệ bằng chuỗi rỗng (""), tức là loại bỏ chúng. Vì bạn cần phải giữ cho CR và LF ký tự (và không gian), chúng phải được bổ sung vào bộ ký tự hợp lệ:

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); 
    } 
} 

Output:

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

Lưu ý rằng TAB sau árvíztűrő được thay thế bằng một không gian duy nhất.

Về đạn:

tôi đã thực hiện một danh sách gạch đầu dòng trong Word và sao chép nó vào một textarea trong một trang web. Sau đó, tôi đã lưu HTML và tìm ra rằng các viên đạn được lưu dưới dạng ký tự được mã hóa UTF-8 E280A2. Đây là những gì tôi gọi là "biểu diễn viên đạn" ở trên. Bạn nên tìm ra các biểu diễn nhị phân của các nhân vật đạn càng tốt và thêm chúng vào mô hình đầu tiên: hoặc OR họ với nhân vật TAB, hoặc đặt tất cả trong số họ thành một bộ ký tự:

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); 
    } 
} 

Output (bạn nên thay đổi console phông chữ để Lucida console để xem viên đạn):

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

Bây giờ, thêm vào TAB, viên đạn vào đầu mỗi dòng cũng đã được thay thế bằng một không gian.

+0

Cảm ơn rất nhiều @kol, vì người dùng đang sao chép dữ liệu từ MS, tôi muốn hỗ trợ "và" ký tự. Làm thế nào để tôi thêm nó vào regex ở trên. Tôi đã thử thêm các ký tự như vậy, nhưng nó sẽ không lọc như mong đợi. Bất kỳ trợ giúp về điều này là rất appriciated. Cảm ơn một lần nữa. – NoobDeveloper

+0

Bạn được chào đón. Tôi nghĩ "và" có thể được thêm vào tập hợp các ký tự hợp lệ như chuỗi ký tự thoát Unicode. Tôi sẽ thử \ u2018- \ u201f, xem tại đây: http://www.techabulary.com/u/unicode/ – kol

0

Tôi nghĩ rằng bạn nên được chẩn đoán vấn đề cơ bản, thay vì nói "một số lý do" và cố gắng để sửa chữa các triệu chứng, nhưng đó không phải là câu hỏi của bạn:

Bạn sẽ muốn regex này:

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

Để khớp với bất kỳ ký tự nào không được phép và sau đó bạn sẽ muốn thay thế ký tự đó bằng String.Empty. Sau đó, bạn sẽ chỉ muốn đối sánh:

\t 

Và thay thế bằng " ".

+1

bạn không cần để thoát khỏi bất cứ điều gì trong '[]' ngoại trừ '[]' – Anirudha

+0

Hoàn toàn không đúng sự thật. Hãy thử regex [\ s] với "s". Ngoài ra, khi bạn chỉnh sửa bài đăng của người nào đó, hãy đảm bảo các chỉnh sửa của bạn không thay đổi câu trả lời và làm cho nó không hợp lệ. –

Các vấn đề liên quan