2015-06-22 3 views
1

Я пытаюсь заменить все . (периоды) с ключевым словом XXX, которые лежат в алфавитно-цифровом слове в большом тексте.Java recursive/repeat regex

Например: I am trying to match a.b.c.d.e ...
Ожидаемый результат: I am trying to match aXXXbXXXcXXXdXXXe ...

шаблон я использовал: (\w+)([\.]+)(\w+)
Фактический результат: I am trying to match aXXXb.cXXXd.e ...

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

ответ

1

Вы можете использовать lookarounds:

str = str.replaceAll("(?<=[a-zA-Z0-9])\\.(?=[a-zA-Z0-9])", "XXX"); 

RegEx Demo

Lookaround Reference

+1

Thanks @Kasra: Добавлено в ответ. – anubhava

+0

Спасибо большое Анубхаве. Regex отлично поработал :) Я читал об искажениях, их использование может замедлить работу. У меня есть большие документы, на которых я должен запускать такие типы регулярных выражений. Я дам ему попробовать. Еще раз спасибо! –

+0

Это одно из простых обращений, поэтому я не вижу здесь проблемы с производительностью. – anubhava

0

Почему бы вам не сделать что-то вроде, если вы хотите изменить все. -

str = str.replaceAll("\\.", "XXX"); 

Или ниже, если вы не хотите менять. если есть какой-либо первый или последний индекс -

str = str.replaceAll("\\.", "XXX").replaceAll("^XXX", ".").replaceAll("XXX$", "."); 
+1

Спасибо Раману. Меня интересует замена (период) на XXX в ** буквенно-цифровом ** слове, а не на всех периодах в данном тексте. Например: ** Попытка заменить a.b.c.d.e и $ .b .... ** Ожидаемый результат: ** Попытка заменить aXXXbXXXcXXXdXXXe и $ .b .... **. Любая помощь будет оценена по достоинству. –