По какой-то причине, в веб-приложении, которое я обслуживаю, ни решение Alireza Fattahi , ни решение JJ Roman работало правильно. В обоих случаях компиляция идет хорошо (она видит банку), но упаковка не может содержать банку внутри войны.
Единственный способ, которым я смог заставить его работать, - положить банку на /src/main/webapp/WEB-INF/lib/
, а затем объединить его с решением Фаттахса или Романа.
Предполагая, что вы хотите обрезать не буквенно-цифровые символы из начала и конца строки:
s = new string(s.SkipWhile(c => !char.IsLetterOrDigit(c))
.TakeWhile(char.IsLetterOrDigit)
.ToArray());
Если вам нужно удалить любой символ, который не является буквенно-цифровым, вы можете использовать IsLetterOrDigit
в паре с Where
для прохождения каждого символа. И поскольку мы работаем на уровне char
, нам понадобится немного Concat
в конце, чтобы вернуть все обратно в 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
Примечание: это приведет к удалению каждого не алфавитно-цифрового символа из вашей строки, если вам действительно нужно удалите только тех, кто находится в начале / конце, добавьте более подробную информацию о том, что определяет начало или конец и добавьте больше примеров.
И вы также можете заменить все не-буквы / цифры в начале и / или конце строки:
^[^\p{L}\p{N}]*|[^\p{L}\p{N}]*$
, используемый как
resultString = Regex.Replace(subjectString, @"^[^\p{L}\p{N}]*|[^\p{L}\p{N}]*$", "", RegexOptions.Multiline);
Если вы действительно хотят только удалить символы в начале и конце строки и не делать это по строкам, а затем удалить опцию ^ $ в параметре linebreak (RegexOption.Multiline)
Если вы хотите включить ведущие или завершающие символы подчеркивания, в качестве символов, которые нужно сохранить, вы можете упростить регулярное выражение:
^\W+|\W+$
Ядро регулярного выражения:
[^\p{L}\p{N}]
является отрицательным символьным классом, который включает все символы в классе Unicode букв \ p {L} или Numbers \ 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
Без использования регулярных выражений: на 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
}
Вы можете использовать функцию String String.Trim Method (Char[])
в библиотеке .NET
, чтобы обрезать ненужные символы из данной строки.
Из MSDN: String.Trim Method (Char[])
Удаляет все ведущие и завершающие вхождения набора символов, заданных в массиве из текущего объекта String.
blockquote>Перед обрезкой нежелательных символов вам необходимо сначала определить, символ
Letter
ИлиDigit
, если он не является алфавитно-цифровым, вы можете использовать функциюString.Trim Method (Char[])
для его удаления.вам нужно использовать функцию Char.IsLetterOrDigit (), чтобы идентифицировать
Из MSDN:
Char.IsLetterOrDigit()
Указывает, является ли символ Юникода классифицированным как буква или десятичная цифра .
blockquote>Попробуйте следующее:
string str = "()&*1@^#47*^#21%Littering aaaannnndóú(*&^1#*32%#**)7(#9&^"; foreach (char ch in str) { if (!char.IsLetterOrDigit(ch)) str = str.Trim(ch); }
Выход:
1@^#47*^#21%Littering aaaannnndóú(*&^1#*32%#**)7(#9
@"[^\p{L}\s-]+(test\d*)|(test\d*)[^\p{L}\s-]+","$1
"