Подтвердить что ты не робот

Regex удалить все специальные символы из строки?

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

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

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 является особенным в моих обстоятельствах.

4b9b3361

Ответ 1

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

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

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

"TRA-12:123"
"TRA-121:23"

Ответ 2

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

[^a-zA-Z0-9]

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

Ответ 3

[^a-zA-Z0-9] - это класс символов, соответствующий любым несимвольным символам.

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

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

string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");

Ответ 4

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

string regExp = "\\W";

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

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

Ответ 5

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

Ответ 6

tmp = Regex.Replace(n, @"\W+", "");

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

Ответ 7

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

html = Regex.Replace(html, "[^\x00-\x80]+", "")

Ответ 8

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

char.IsLetterOrDigit

Вы можете использовать это для прокрутки каждой строки char строки и только возвращать, если true.