Регулярное выражение для удаления всех специальных символов из строки?



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



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

500   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

    Ничего не найдено.