Удалите все символы латинского алфавита с помощью regex

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

Существует некоторое оптимальное решение с использованием регулярного выражения? Мое фактическое регулярное выражение (как Удалить символы с использованием Regex):

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

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

Ответ 1

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

string clean = Regex.Replace(messy, @"[^[email protected]#]+", "");

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

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

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

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

Ответ 2

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

Regex regex = new Regex(@"[^a-zA-Z0-9_]");

Ответ 3

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

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

Цель состоит в том, чтобы просто включать ASCII-символы A-Z и цифры и знаки препинания. Просто исключите все за пределами этого диапазона с помощью RegEx.

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

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

[^\x20-\x7e]

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

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

Удачи!

Бест,

-Auri

Ответ 5

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

[^\x00-\x80]

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

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

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

Ответ 6

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

([\p{L}]+)