2015-04-19 10 views
0

Я пытаюсь пройти через документ и изменить все экземпляры имени, используя регулярные выражения в Java. Мой код выглядит примерно так:Regex заменить слово при сохранении пробелов/пунктуации

Pattern replaceWordPattern = Pattern.compile("(^|\\s)" + replaceWord + "^|\\W"); 

следуют:

String line = matcher.replaceAll("Alice"); 

Проблема заключается в том, что это не сохраняет пробелы и знаки препинания и другие символы, не слова, которые следовали. Если бы у меня был «Джек прыгнул», он становится «Алисидженд». Кто-нибудь знает, как это исправить?

ответ

3

\W потребляет пространство после replaceWord. Замените ^|\\W на границу слова \\b, которая не использует символы. Подумайте о том же, что и для первой группы разделителей, поскольку я подозреваю, что вы не хотите ничего там есть.

Pattern replaceWordPattern = Pattern.compile("\\b" + replaceWord + "\\b"); 

Если семантика словоразделов не подходит для вас, рассмотреть возможность использования lookahead and lookbehind constructs, которые не потребляют вход тоже.

-3

Вы упускаете скобки на втором выражении непробельного характера:

Pattern replaceWordPattern = Pattern.compile("[^|\\s]" + replaceWord + "[^|\\W]"); 
+0

Ваш синтаксис регулярного выражения неверен, он должен быть '(...)' не классом символов. Также это не будет соответствовать тому, что происходит после OP. – hwnd

Смежные вопросы