#c# #.net #regex
#c# #.net #регулярное выражение
Вопрос:
каков наилучший способ обрезать ВСЕ не буквенно-цифровые символы из начала и конца строки? Я попытался добавить символы, которые мне не нужны вручную, но это плохо работает, и используйте . Мне просто нужно обрезать все, что не является буквенно-цифровым.
Я попытался использовать эту функцию:
string something = "()amp;*1@^#47*^#21%Littering aaaannnndóú(*amp;^1#*32%#**)7(#9amp;^";
string somethingNew = Regex.Replace(something, @"[^p{L}-s] ", "");
Но это удаляет из строки все символы, которые не являются буквенно-цифровыми. В принципе, я хочу вот чего:
"test1" -> test1
#!@!2test# -> 2test
(test3) -> test3
@@test4---- -> test4
Я хочу поддерживать символы Юникода, но не символы..
РЕДАКТИРОВАТЬ: вывод примера должен быть:
Littering aaaannnndóú
С уважением
Комментарии:
1. Я подозреваю, что вы имеете в виду
#!@!2test -> 2test
не#!@!2test -> test
во втором примере того, что вы хотите. Удаление2
несовместимо с другими примерами и вашим описанием того, что вы хотите.2. Да, я сожалею, что я только что отредактировал это
3. @circler Вы все еще показываете, что отбрасываете начальную букву «2» во втором примере. Пожалуйста, объясните логику этого, поскольку ‘2’ является числовым символом
4. @J0e3gan Я обновил его снова
Ответ №1:
Предполагая, что вы хотите обрезать не алфавитно-цифровые символы из начала и конца вашей строки:
s = new string(s.SkipWhile(c => !char.IsLetterOrDigit(c))
.TakeWhile(char.IsLetterOrDigit)
.ToArray());
Комментарии:
1. Я хочу удалить оба не алфавитных символа с начала и с конца. Я только что отредактировал примеры
Ответ №2:
@"[^p{L}s-] (testd*)|(testd*)[^p{L}s-] ","$1
»
Комментарии:
1. «test» был только примером строки
Ответ №3:
Вы можете использовать строковую функцию String.Trim Method (Char[])
в .NET
библиотеке, чтобы обрезать ненужные символы из заданной строки.
Из MSDN : String.Trim Method (Char[])
Удаляет все начальные и конечные вхождения набора символов, указанного в массиве, из текущего строкового объекта.
Прежде чем обрезать ненужные символы, вам нужно сначала определить, является ли символ Letter
или Digit
, если он не алфавитно-цифровой, вы можете использовать String.Trim Method (Char[])
function для его удаления.
вам нужно использовать символ Char .Функция IsLetterOrDigit() для определения, является ли символ буквенно-цифровым или нет.
Из MSDN: Char.IsLetterOrDigit()
Указывает, классифицируется ли символ Unicode как буква или десятичная цифра.
Попробуйте это:
string str = "()amp;*1@^#47*^#21%Littering aaaannnndóú(*amp;^1#*32%#**)7(#9amp;^";
foreach (char ch in str)
{
if (!char.IsLetterOrDigit(ch))
str = str.Trim(ch);
}
Вывод:
1@^#47*^#21%Littering aaaannnndóú(*amp;^1#*32%#**)7(#9
Ответ №4:
Если вам нужно удалить какой-либо символ, который не является буквенно-цифровым, вы можете использовать IsLetterOrDigit
в паре с a Where
, чтобы пройти через каждый символ. И поскольку мы работаем на char
уровне, нам понадобится немного Concat
в конце, чтобы вернуть все обратно в a string
.
string result = string.Concat(input.Where(char.IsLetterOrDigit));
который вы можете легко преобразовать в метод расширения
public static class Extensions
{
public static string ToAlphaNum(this string input)
{
return string.Concat(input.Where(char.IsLetterOrDigit));
}
}
которые вы можете использовать следующим образом :
string testString = "#!@!"(test123)"";
string result = testString.ToAlphaNum(); //test123
Примечание: это приведет к удалению всех не алфавитно-цифровых символов из вашей строки, если вам действительно нужно удалить только те, которые находятся в начале / конце, пожалуйста, добавьте более подробную информацию о том, что определяет начало или конец, и добавьте больше примеров.
Ответ №5:
И вы также можете заменить все не-буквы / цифры в начале и / или конце строки:
^[^p{L}p{N}]*|[^p{L}p{N}]*$
используется как
resultString = Regex.Replace(subjectString, @"^[^p{L}p{N}]*|[^p{L}p{N}]*$", "", RegexOptions.Multiline);
Если вы действительно хотите удалять только символы в начале и конце «строки», а не делать это построчно, затем удалите опцию ^$ match at linebreak (RegexOption .Многострочный)
Если вы хотите включить начальные или конечные символы подчеркивания в качестве сохраняемых символов, вы могли бы упростить регулярное выражение до:
^W |W $
Ядро регулярного выражения:
[^p{L}p{N}]
является отрицаемым символьным классом, который включает в себя все символы в классе Unicode букв p {L} или цифр p {N}
Другими словами:
Обрезать не-юникодные буквенно-цифровые символы
^[^p{L}p{N}]*|[^p{L}p{N}]*$
Options: Case sensitive; Exact spacing; Dot doesn't match line breaks; ^$ match at line breaks; Parentheses capture
Match this alternative «^[^p{L}p{N}]*»
Assert position at the beginning of a line «^»
Match any single character NOT present in the list below «[^p{L}p{N}]*»
Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
A character from the Unicode category “letter” «p{L}»
A character from the Unicode category “number” «p{N}»
Or match this alternative «[^p{L}p{N}]*$»
Match any single character NOT present in the list below «[^p{L}p{N}]*»
Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
A character from the Unicode category “letter” «p{L}»
A character from the Unicode category “number” «p{N}»
Assert position at the end of a line «$»
Создано с помощью RegexBuddy
Ответ №6:
Без использования регулярных выражений: в Java вы могли бы сделать: (в c # синтаксис был бы почти таким же с той же функциональностью)
while (true) {
if (word.length() == 0) {
return ""; // bad
}
if (!Character.isLetter(word.charAt(0))) {
word = word.substring(1);
continue; // so we are doing front first
}
if (!Character.isLetter(word.charAt(word.length()-1))) {
word = word.substring(0, word.length()-1);
continue; // then we are doing end
}
break; // if front is done, and end is done
}