Java удаляет все не буквенно-цифровые символы из начала и конца строки

Я знаю, как заменить ВСЕ небуквенно-цифровые символы в строке, но как это сделать только с начала и конца строки?

Мне нужна эта строка:

"строка,"

to be:

строка

заменить ВСЕ небуквенно-цифровые символы в строке:

s = s.replaceAll("[^a-zA-Z0-9\\s]", "");

person Mike6679    schedule 26.07.2014    source источник
comment
Сколько с начала и с конца?   -  person Elliott Frisch    schedule 26.07.2014
comment
скинь пример пожалуйста   -  person Rod_Algonquin    schedule 26.07.2014
comment
docs.guava-libraries.googlecode.com/git/javadoc/com/google/   -  person Matt Ball    schedule 26.07.2014


Ответы (4)


Используйте привязки ^ (совпадения в начале строки) и $ (совпадения в конце):

s = s.replaceAll("^[^a-zA-Z0-9\\s]+|[^a-zA-Z0-9\\s]+$", "");
person falsetru    schedule 26.07.2014
comment
Что этот \\s там делает? Я знаю, что это было у OP, но это было неправильно тогда и неправильно сейчас. - person David Conrad; 26.07.2014
comment
@DavidConrad, \\s будет соответствовать любому пробельному символу. Я думал, что намерением OP было исключить буквенно-цифровые символы и символы пробела, поэтому я не трогал его. - person falsetru; 26.07.2014
comment
Именно поэтому и неправильно. OP сказал заменить ВСЕ небуквенно-цифровые символы в строке. Это инвертированный набор, поэтому он заменит все, КРОМЕ a-z, A-Z, 0-9 и любой пробельный символ. Таким образом, он останется в пробеле. - person David Conrad; 26.07.2014
comment
Я думаю, что ОП пытался сопоставить ДО пробела и не понял, как работают наборы. Думаю, я могу ошибаться. - person David Conrad; 26.07.2014
comment
@falsetru удаляет ВСЕ не буквенно-цифровые символы с начала и конца строки или только по одному в начале и в конце? - person Mike6679; 26.07.2014
comment
@Mike, он удаляет все не буквенно-цифровые + не пробелы с начала и конца строки. (Я использовал +). Если вы хотите удалить только one, удалите +. - person falsetru; 26.07.2014
comment
Просто примечание: хотя это действительно сработало, мне пришлось заменить его собственным парсером, потому что выражение регулярного выражения было слишком дорогим для тысяч итераций. - person Mike6679; 26.07.2014

Использовать:

s.replaceAll("^[^\\p{L}^\\p{N}\\s%]+|[^\\p{L}^\\p{N}\\s%]+$", "")

Вместо:

s.replaceAll("^[^a-zA-Z0-9\\s]+|[^a-zA-Z0-9\\s]+$", "")

Где p{L} – любая буква любого языка.
А p{N} – любой цифровой символ любого алфавита.
Для использования в алфавитах на основе латиницы, когда требуются неанглийские языки, например испанский: Эстас, апунто; станет в последнем; стас и апунт. Первый также работает с языками, не основанными на латыни.
Для всех индоевропейских языков добавьте p{Mn} для арабских и еврейских гласных:

s.replaceAll("^[^\\p{L}^\\p{N}^\\p{Mn}\\s%]+|[^\\p{L}^\\p{N}^\\p{Mn}\\s%]+$", "")

В дравидийских языках гласные могут окружать согласные - в отличие от семитских языков, где они находятся «внутри» символа - например, ಾ. Для этого используйте p{Me} вместо этого. Для всех языков используйте:

s.replaceAll("^[^\\p{L}^\\p{N}^\\p{M}\\s%]+|[^\\p{L}^\\p{N}^\\p{M}\\s%]+$", "")

Список категорий Unicode см. в руководстве по регулярному выражению.

person Danielson    schedule 22.08.2016

Это удаляет все не буквенно-цифровые символы

s = s.replaceAll("[^a-zA-Z0-9]", "");
person ranamiteshkumar    schedule 26.07.2014
comment
Это удаляет все не буквенно-цифровые символы - person O. Jones; 23.12.2014
comment
Ответы, содержащие только код, считаются некачественными: обязательно объясните, что делает ваш код и как он решает проблему. Если вы добавите больше информации в свой пост, это поможет как автору вопроса, так и будущим читателям. См. также Объяснение ответов, полностью основанных на коде: мета. stackexchange.com/questions/114762/ - person borchvm; 28.10.2019

CharMatcher от Guava предлагает краткое решение. :

CharMatcher.javaLetterOrDigit().negate().trimFrom(input);
person Bunarro    schedule 28.10.2019