Использование регулярных выражений для сопоставления несловесных символов, НО НЕ смайликов - PullRequest
3 голосов
/ 19 сентября 2011

У меня есть 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

Редактировать: Игнорировать это исправление, см. Принятый ответ ниже.

1 Ответ

4 голосов
/ 19 сентября 2011

Это должно быть довольно легко из-за негативного взгляда. По существу, совпадение будет неудачным в любой позиции, где совпадает регулярное выражение внутри группы (?!...). Вы должны следовать за отрицательным заголовком с одним подстановочным знаком (.), чтобы использовать символ, если заголовок не соответствует (это означает, что следующий символ - это не буквенный символ, который не является частью смайлика).

edit: Очевидно, что я не очень тщательно проверил свое оригинальное регулярное выражение, вам также нужен отрицательный взгляд за спиной после ., чтобы убедиться, что персонаж, которого вы потребляли, не был вторым персонажем в смайлике :

(?![a-zA-Z ]|=\)|=\]|:P).(?<!=\)|=\]|:P)

Обратите внимание, что вы можете сократить регулярное выражение, используя классы символов для глаз и рта, например:

[:=][\(\)\[\]]
  ^    ^-----mouth
  |--eyes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...