Удалите все символы латинского алфавита с помощью 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}]+)