Регулярное выражение Java для удаления определенной пунктуации

Я форматирую очень большое количество текстовых файлов с помощью java, и мне нужно удалить все знаки препинания, кроме апострофов. Когда я первоначально настроил регулярное выражение для оператора replaceAll, оно помогло избавиться от всего, о чем я знал, за исключением того, что теперь я нашел один конкретный файл/набор пунктуации, в котором он не работает.

    holdMe = holdMe.replaceAll("[,_\"-.!?:;)(}{]", " ");

Я знаю, что попадаю в это утверждение, потому что все остальные знаки препинания очищаются, нет точек, запятых и так далее. Я пытался экранировать символы () и {}, но они все равно не заменяются этими символами. Я пытался научить себя регулярному выражению, используя документацию Oracle, но я не могу понять, почему это не работает.


person Heather T    schedule 14.07.2014    source источник
comment
Вам нужно будет показать несколько образцов ввода и вывода.   -  person Jim Garrison    schedule 14.07.2014
comment
Вопрос не позволил мне включить текст, с которым у меня возникла проблема, он распознавался как код, поэтому вот текст проблемы. На выходе получается то же, что и на входе. ** Мы делаем это для тех нигеров, которые живут на условно-досрочном освобождении (Мои уличные дураки, которые вставляют стекло в золото) {мы всегда будем это делать} Даже если я заперт {мы все равно будем это делать} (И старые пушки на блок) {мы все еще собираемся это сделать} соседским копам {мы все еще собираемся сделать это} {мы все еще собираемся сделать это, мы всегда будем это делать}**   -  person Heather T    schedule 14.07.2014


Ответы (3)


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

[\p{P}&&[^\u0027]]

Java-строка регулярного выражения:

"[\\p{P}&&[^\u0027]]"
person Andie2302    schedule 14.07.2014
comment
Этот ответ был бы идеальным, за исключением того, что вопрос заключается в том, чтобы исключить апострофы, которые являются \x27, а не символами двойных кавычек или NUL. - person VGR; 14.07.2014
comment
Вы можете пойти еще дальше и просто использовать символ ' непосредственно в регулярном выражении, что должно упростить его понимание. - person VGR; 14.07.2014
comment
Это ответ! - person Recomer; 27.10.2016

Вместо того, чтобы конкретно указывать каждый символ, который вы хотите удалить, почему бы не сделать наоборот и указать, который вы хотите разрешить, и добавить к нему префикс «нет»?

holdMe = holdMe.replaceAll("[^a-zA-Z0-9'\\s]+"," ");

Приведенное выше заменит все, кроме пробелов, буквенно-цифровых символов и апострофов, на " ".

person Othya    schedule 14.07.2014
comment
Пришлось добавить еще один \, чтобы избежать \s, но он по-прежнему не заменяет символы {} и () в этом фрагменте. - person Heather T; 14.07.2014

Проверь это:

public static void main(String[] args) {
        /* use \\ (double) before { } [ ] */
        String m = "this:{[]}/; is a test".replaceAll("[\\[\\]\\{\\}\\/,_\"-.!?:;)(]", " ");
        System.out.println(m);
    }

Выход:

this        is a test
person Soley    schedule 14.07.2014