Удалите все исключительные латинские символы, используя регулярные выражения - PullRequest
10 голосов
/ 16 марта 2011

Я занимаюсь разработкой программного обеспечения на португальском языке, поэтому многие из моих сущностей имеют такие имена, как «maça» или «lição», и я хочу использовать эту сущность в качестве ключа ресурса.Поэтому я хочу сохранить все символы, кроме 'ç, ã, õ ....'

Есть ли какое-то оптимальное решение с использованием регулярных выражений?Мое действительное регулярное выражение (как Удалить символы с помощью регулярного выражения предложить):

Regex regex = new Regex(@"[\W_]+");
string cleanText = regex.Replace(messyText, "").ToUpper();

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

Ответы [ 6 ]

7 голосов
/ 16 марта 2011

Простым вариантом является внесение в белый список принятых символов:

string clean = Regex.Replace(messy, @"[^a-zA-z0-9!@#]+", "");

Если вы хотите удалить все буквы, отличные от ASCII, но оставить все остальные символы, вы можете использовать вычитание класса символов :

string clean = Regex.Replace(messy, @"[\p{L}-[a-zA-Z]]+", "");

Он также может быть записан как более стандартный и сложный [^\P{L}a-zA-Z]+ (или [^\Wa-zA-Z]), который гласит «выбрать все символы, которые не (не буквы слова или буквы ASCII)», что заканчивается буквами, которые мы ищем.

Вы также можете считать следующий подход более полезным: Как удалить диакритические знаки (акценты) из строки в .NET?

4 голосов
/ 16 марта 2011

Другим вариантом может быть преобразование из Unicode в ASCII.Это не будет сбрасывать символы, но конвертировать их в ? с.Это может быть лучше, чем отбрасывать их (для использования в качестве ключей).

string suspect = "lição";
byte[] suspectBytes = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(suspect));
string purged = Encoding.ASCII.GetString(suspectBytes);
Console.WriteLine(purged); // li??o

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

4 голосов
/ 16 марта 2011

Это работает?

Regex regex = new Regex(@"[^a-zA-Z0-9_]");
2 голосов
/ 06 марта 2012

Цель должна состоять в том, чтобы просто включить символы ASCII AZ и цифры и знаки препинания.Просто исключите все, что находится за пределами этого диапазона, используя RegEx.

string clean = Regex.Replace(messy, @"[^\x20-\x7e]", String.Empty);

Для ясности, я использую регулярное выражение:

[^\x20-\x7e]

Вам может понадобиться экранировать \ символ - IЯ не проверял это ни в чем, кроме RegEx buddy:)

Это исключает все, что находится за пределами символов ASCII 0x20 и 0x7e, что переводит в десятичный диапазон ASCII 32-127.

Удачи!

Лучший,

-Аури

1 голос
/ 16 марта 2011

Я думаю, что лучшим регулярным выражением будет использование:

[^\x00-\x80]

Это отрицание всех символов ASCII.Он соответствует всем не-ASCII символам: \x00 и \x80 (128) - это шестнадцатеричный код символа, а - означает диапазон.^ внутри [ и ] означает отрицание.

Замените их пустой строкой, и у вас должно получиться то, что вы хотите.Это также освобождает вас от беспокойства о пунктуации и т. П., Которые не являются ASCII и могут вызывать едва заметные, но раздражающие (и трудно отслеживаемые) ошибки.

Если вы хотите использовать расширенный набор ASCII как допустимыйсимволы, вы можете сказать \xFF вместо \x80.

0 голосов
/ 22 июля 2013

Это более полезно для меня:

([\p{L}]+)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...