Удалить спецсимвол из строки, только если не внутри слова - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу заменить все специальные символы из строки, но только если они не находятся внутри слова.

Специальные символы: <>{}\"/|;:.,~!?@#$%^=&*'

Пример:

String str = "//won't won't wo/'n't wont wont'."
str.replaceAll(,"") // "won't won't won't wont wont"

Кто-нибудь знает, как достичь этого через регулярное выражение?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Это RegEx:

(?<!\w)\W+|\W+(?!\w)

Соответствует любому из двух альтернативных RegEx. (1|2)

  1. Любой специальный символ (не символ слова: \W), которому не предшествует символ слова (\w)
  2. Любой специальный символ, за которым не следует символом слова.

Это работает, потому что, если любой из них совпадает, специальный символ не должен быть в слове

"предшествует": положительный взгляд позади. (?<=y)X: X предшествует y
"не предшествует": отрицательный взгляд позади. (?<!y)X: X не предшествует y
«сопровождается»: позитивный взгляд. X(?=y): за X следует y
"не следует": отрицательный взгляд. X(?!y): за X не следует y.

Вы должны заменить \W набором специальных символов (соответственно экранированных)

Одна вещь, которую следует отметить с этим решением, - это то, что не зависит от наличия пробела.

0 голосов
/ 06 апреля 2020

Попробуйте:

(?<![a-z])[<>{}"\/|;:.,~!?@#$%^=&*']|[<>{}"\/|;:.,~!?@#$%^=&*'](?![a-z])

с установленным флагом без учета регистра (/i)

Демо

Java ' s regex engine выполняет следующие операции.

(?<![a-z])                  # match a letter in a
                            # negative lookbehind
[<>{}"\/|;:.,~!?@#$%^=&*']  # match a special character
|
[<>{}"\/|;:.,~!?@#$%^=&*']  # match a special character
(?![a-z])                   # match a letter in a
                            # negative lookahead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...