У меня есть Java-программа, которая должна удалить все не буквенные символы из строки, кроме случаев, когда они представляют собой смайлики, такие как =) или =] или: P
Это очень легко сопоставитьнаоборот с [a-zA-Z ]|=\)|=\]|:P
, но я не могу понять, как отрицать это выражение.Поскольку я использую функцию String.replaceAll (), она должна быть в отрицательной форме.
Я полагаю, что часть проблемы может быть связана с тем фактом, что улыбки обычно имеют длину 2 символа, а я сопоставляю только 1символ за раз?
Интересно, что replaceAll("(?![Tt])[Oo]","")
удаляет все вхождения буквы O, даже в слове "to".Означает ли это, что моя функция replaceAll не понимает regex lookahead?Он не выдает никаких ошибок ...
В итоге я использовал
replaceAll("(?<![=:;])[\\]\\[\\(\\)\\/]","")
.replaceAll("[=:;](?![\\]\\[\\(\\)o0OpPxX\\/])","")
.replaceAll("[^a-zA-Z=:;\\(\\)\\[\\]\\/ ]","")
, который очень грязный, но отлично работает.The... quick! (brown) fox jump's over the[] lazy dog. :] =O ;X
становится THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG :] =O ;X
Редактировать: Игнорировать это исправление, см. Принятый ответ ниже.