Регулярное выражение для удаления всех специальных символов из строки?
Я полностью неспособен к регулярным выражениям, и поэтому мне нужна помощь с проблемой, которую, по моему мнению, лучше всего решить с помощью регулярных выражений.
У меня есть список строк в 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 элементов, поэтому мне нужен поиск и замена, чтобы быть эффективным и быстрым, если это возможно.
изменить:
Я должен был указать, что любой символ рядом с a-z, A-Z и 0-9 является особенным в моих обстоятельствах.
9 ответов:
Это действительно зависит от вашего определения специальных символов. Я считаю, что белый список, а не черный список является лучшим подходом в большинстве ситуаций:
tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");вы должны быть осторожны с вашим текущим подходом, потому что следующие два элемента будут преобразованы в одну строку и поэтому будут неразличимы:
"TRA-12:123" "TRA-121:23"
Это должно сделать это:
[^a-zA-Z0-9]в основном он соответствует всем не буквенно-цифровым символам.
[^a-zA-Z0-9]класс символов соответствует любым не буквенно-цифровым символам.кроме того,
[^\w\d]делает то же самое.использование:
string regExp = "[^\w\d]"; string tmp = Regex.Replace(n, regExp, "");
вы можете использовать:
string regExp = "\W";Это эквивалентно ""
\W соответствует любому несловесным символом. Эквивалентно категориям Юникода
[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].
в зависимости от вашего определения "специальный символ", я думаю, что "[^A-zA-Z0-9]", вероятно, сделает трюк. Это позволит найти все, что не является маленькой буквой, заглавной буквой или цифрой.
tmp = Regex.Replace(n, @"\W+", "");
\wсоответствует буквам, цифрам и подчеркиваниям,\W- это отрицательная версия.
для моих целей я хотел все английские символы ASCII, так что это сработало.
html = Regex.Replace(html, "[^\x00-\x80]+", "")
Если вы не хотите использовать регулярное выражение, то другой вариант-использовать
char.IsLetterOrDigitвы можете использовать это для перебора каждого символа строки и возвращать только если true.
public static string Letters(this string input) { return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x))); }
Comments