Обрезать не алфавитные символы из начала и конца строки

#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
}
 

Ответ №7:

вы могли бы использовать этот шаблон

 ^[^[:alnum:]] |[^[:alnum:]] $  
 

с g
демонстрацией опции