Удалить лишнюю пунктуацию из строки, сохраняя «смайлики»? - PullRequest
2 голосов
/ 20 марта 2012

У меня проблемы с использованием регулярного выражения. Можете ли вы помочь мне? Следующее в задаче, которую я пытаюсь решить -

Input - :,... :(..:::))How are you today?..:(
Output - :( :) How are you today :(

В основном я хочу удалить знаки препинания из входной строки, такие как - (.,:; И т. Д.) И заменить их пустой строкой. Но я хочу оставить смайлики - :) или :(. Я написал следующий код, но он не работает.

String s = ":,... :(..:::))How are you today?..:( ";  
Pattern pattern = Pattern.compile("^(\\Q:)\\E|\\Q:(\\E)(\\p{P}+)");  
Matcher matcher = pattern.matcher(s);    
s = matcher.replaceAll("");

Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Попробуйте что-то вроде этого:

[\p{P}&&[^:()]]|:(?![()])|(?<!:)[()]

Быстрый отказ:

[\p{P}&&[^:()]]    # any punctuation mark except ':', '(' and ')'
|                  # OR
:(?![()])          # a ':' not followed by '(' or ')'
|                  # OR
(?<!:)[()]         # a '(' or ')' not preceded by ':'

Обратите внимание, что [ ... && [^ ... ]] (set вычитание) является уникальным для реализации регулярных выражений Java. Смотри: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

1 голос
/ 20 марта 2012

Вы можете попробовать это:

    String s = ":,...:(..:::))How are you today?..:( ";  
    Pattern pattern = Pattern.compile("(:\\)|:\\(|[^\\p{Punct}]+|\\s+)");  
    Matcher matcher = pattern.matcher(s); 
    String res="";
    while(matcher.find()){
        res+=matcher.group(0);
    }
    System.out.println(res);

Результат

:( :) Как ты сегодня: (

1 голос
/ 20 марта 2012

Я тестировал в JavaScript с этим:

[.,:;](?![)(])

Так что это переводится на что-то подобное в Java

{Punct}(?![)(])
\\p{P}(?![)(])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...