Regex, чтобы удалить все специальные символы из строки? - PullRequest
61 голосов
/ 22 июля 2010

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

У меня есть список строк в C #:

List<string> lstNames = new List<string>();
lstNames.add("TRA-94:23");
lstNames.add("TRA-42:101");
lstNames.add("TRA-109:AD");

foreach (string n in lstNames) {
  // logic goes here that somehow uses regex to remove all special characters
  string regExp = "NO_IDEA";
  string tmp = Regex.Replace(n, regExp, "");
}

Мне нужно иметь возможность перебирать список и возвращать каждый элемент без каких-либо специальных символов. Например, первая позиция будет «TRA9423», вторая будет «TRA42101», а третья будет «TRA109AD».

Есть ли регулярное выражение, которое может сделать это для меня?

Кроме того, список содержит более 4000 наименований, поэтому мне нужно, чтобы поиск и замена были эффективными и быстрыми, если это возможно.

EDIT: Я должен был указать, что любой символ, кроме a-z, A-Z и 0-9, является особенным в моих обстоятельствах.

Ответы [ 9 ]

104 голосов
/ 22 июля 2010

Это действительно зависит от вашего определения специальных символов.Я считаю, что белый, а не черный список является лучшим подходом в большинстве ситуаций:

tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");

Вы должны быть осторожны с вашим текущим подходом, потому что следующие два элемента будут преобразованы в одну строку и поэтомунеразличимы:

"TRA-12:123"
"TRA-121:23"
16 голосов
/ 22 июля 2010

[^a-zA-Z0-9] - класс символов соответствует любым не буквенно-цифровым символам.

В качестве альтернативы, [^\w\d] делает то же самое.

Использование:

string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");
16 голосов
/ 22 июля 2010

Это должно сделать это:

[^a-zA-Z0-9]

В основном это соответствует всем не алфавитно-цифровым символам.

8 голосов
/ 22 июля 2010

Вы можете использовать:

string regExp = "\\W";

Это эквивалентно Даниилу "[^a-zA-Z0-9]"

\ W соответствует любому несловесному символу. Эквивалент категориям Unicode [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].

3 голосов
/ 22 июля 2010

В зависимости от вашего определения «специального символа», я думаю, «[^ a-zA-Z0-9]», вероятно, сработает.Это могло бы найти что-либо, кроме маленькой буквы, заглавной буквы или цифры.

2 голосов
/ 11 ноября 2013

Для моих целей мне нужны все английские символы ASCII, так что это сработало.

html = Regex.Replace(html, "[^\x00-\x80]+", "")
2 голосов
/ 22 июля 2010
tmp = Regex.Replace(n, @"\W+", "");

\w соответствует буквам, цифрам и подчеркиванию, \W - отрицательная версия.

0 голосов
/ 19 июня 2018
public static string Letters(this string input)
{
    return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}
0 голосов
/ 30 декабря 2016

Если вы не хотите использовать Regex, тогда другой вариант - использовать

char.IsLetterOrDigit

Вы можете использовать это для циклического прохождения каждого символа в строке и возврата только в случае true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...