2013-02-13 3 views
8

В нашем приложении пользователь вводит данные из слова MS в asp.net textarea control и, наконец, данные сохраняются в SQL Server. По некоторым причинам существует несколько нежелательных символов, которые выглядят как маленькие квадраты при просмотре из SQL Server Management Studio.Заменить регулярным выражением

Это вызывает ошибку при создании Crystal Reports.

Мне нужно регулярное выражение, которое разделит все такие символы вместе с пулями. Единственный допустимый вход:

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

Кроме того, области табуляции следует заменить на одно место. Введите ключ или разрешена новая строка.

В настоящее время я использую

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

, но он не будет работать, чтобы удалить маркеры или вкладки пространства.

Может ли любое regex ninja помочь мне с этой проблемой? Заранее спасибо.

+0

Я знаю, что это не совсем то, что вам нужно, но как насчет включения редактора WYSIWYG в 'textarea', который дает возможность вставить из Word. [TinyMCE] (http://www.tinymce.com/wiki.php/Plugin:paste) имеет плагин для этой задачи? – Tr1stan

+0

Это не вариант для меня на данный момент. – NoobDeveloper

+0

Используйте SQL-функцию 'ASCII', чтобы выяснить, какой именно символ, я предполагаю, что вы ищете неправильный: http://msdn.microsoft.com/en-us/library/ms177545.aspx – Arran

ответ

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ő был заменен одно пространство.

О пуль:

Я сделал маркированный список в Слове и скопировать его в текстовое поле на веб-странице. Затем я сохранил 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); 
    } 
} 

Output (вы должны изменить консольный шрифт Lucida Console, чтобы увидеть пулю):

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

Теперь в дополнение к TAB, пуля в начале каждой строки также была заменена пробелом.

+0

Спасибо большое @kol, поскольку пользователи копируют данные из MS word, я хотел бы поддержать «и» символы. Как добавить его в regex выше. Я попытался добавить эти символы так, как есть, но он не будет фильтровать, как ожидалось. Любая помощь по этому поводу очень приветствуется. Еще раз спасибо. – NoobDeveloper

+0

Добро пожаловать. Я думаю, что «и» могут быть добавлены к набору допустимых символов в виде последовательностей символов символов Unicode. Я бы попробовал \ u2018- \ u201f, см. Здесь: http://www.techabulary.com/u/unicode/ – kol

0

Я думаю, что вы должны диагностировать причину проблемы, а не говорить «какой-то причине» и пытается исправить симптом, но это не ваш вопрос:

Вы хотите, это регулярное выражение:

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

Чтобы соответствовать любому символу, который не разрешен, а затем вы захотите его заменить String.Empty. Тогда вы просто хотите, чтобы соответствовать:

\t 

И заменить его " ".

+1

вам не нужно чтобы избежать чего-либо в '[]' except '[]' – Anirudha

+0

Абсолютно неверно. Попробуйте regex [\ s] против «s». По вашей логике регулярное выражение соответствует либо косой чертой, либо s, но вы обнаружите, что оно фактически совпадает любой символ пробела. Также, когда вы редактируете чей-то пост, убедитесь, что ваши изменения не меняют ответ и делают его недействительным. –

Смежные вопросы