Регулярное выражение, которое избавляет от всех знаков препинания в начале и конце строки
Я пытаюсь придумать регулярное выражение, которое избавляет от всех знаков препинания (если есть один или несколько) как в верхней части, так и в конце строки. Регулярное выражение, которое я использую, теперь выглядит следующим образом:(слово - это строка, которую я хочу преобразовать)
word = word.replaceAll("['?:!.,;]*([a-z]+)['?:!.,;]*", "$1").toLowerCase();
Тем не менее, я все еще получаю некоторые странные случаи. Например, 'Amen'
идет к 'amen'
а также ''tis
идет к 'tis
, Может ли кто-нибудь помочь мне изменить его так, чтобы 'Amen'
будет идти к amen
а также ''tis
в tis
, Заранее спасибо!
3 ответа
Замените следующую схему:
^\p{P}+|\p{P}+$
С пустой строкой.
\p{P}
означает любой знак пунктуации. Первая часть регулярного выражения удалит пунктуацию в начале, а вторая сделает это в конце.
В Java вы можете использовать:
\\p{Punct}
определить знак пунктуации.
Чтобы удалить знак пунктуации из начала или конца, используйте это:
String word = word.replaceAll("^\\p{Punct}+|\\p{Punct}+$", "");
Я не мог воспроизвести проблему с ''tis
становление 'tis
, но проблема с 'Amen'
является то, что ваше регулярное выражение не принимает заглавные буквы, потому что [a-z]
может принимать только строчные буквы Вы можете изменить его, добавив A-Z
к вашему классу персонажей или делая регистр нечувствительным к (?i)
флаг.
Так что попробуйте
replaceAll("['?:!.,;]*([a-zA-Z]+)['?:!.,;]*", "$1")
или же
replaceAll("(?i)['?:!.,;]*([a-z]+)['?:!.,;]*", "$1")
Вы также можете изменить свою стратегию, просто удалив знаки препинания в начале или в конце строки. В этом случае вы можете просто использовать
replaceAll("^\\p{Punct}+|\\p{Punct}+$","");
где
^
представляет начало строки$
представляет конец строки\\p{Punct}
класс символов, представляющий знаки пунктуации (один из!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
персонажи), но вы можете использовать свой собственный['?:!.,;]
класс, если хотите