Необходимо написать программу которая заменяет измененные слова. Например, есть строка "Ты ду_Р-ак или нет?" в данной строке необходимо заменить подстроку ду_Р-ак на ***.
Как написать регулярное выражение если пользователь будет пытаться схитрить и писать слово "дурак" через тире, нижний пробел или другие символы, или если часть слова будет написана на латинице а часть на кириллице.
public static void main(String[] args)
{
String string = "Ты ду_рак или Дур_ак чудак?";
String lower = string.toLowerCase();
String pattern = "дурак";
String p ="***";
String newString = lower.replaceAll(pattern, p);
System.out.println(newString);
}
Ответ
Предлагаю
[дd][\W_]?[уy][\W_]?[рpr][\W_]?[аa][\W_]?[кk]
См. демо регулярного выражения (необходимо использовать модификатор CASE_INSENSITIVE и UNICODE_CHARACTER_CLASS).
Пояснение
[дd] - д или d
[\W_]? - необязательный (? находит 1 или 0 совпадений) символ, отличный от букв и цифр
[уy] - р, p или r
[\W_]? - необязательный символ, отличный от букв и цифр
[рpr] - р, p или r
[\W_]? - необязательный символ, отличный от букв и цифр
[аa] - а или a
[\W_]? - необязательный символ, отличный от букв и цифр
[кk] - к или k
Если "лишних" символов может быть больше одного, замените ? на * в [\W_]?, а если нужно исключить пробел, можно использовать [\W_&&[^\s]]? (не забудьте о двойных обратных слешах в Java).
См. демо на IDEONE
String string = "Ты ду_рак или Дур_ак чудак?";
String pattern = "(?iU)[дd][\\W_]?[уy][\\W_]?[рpr][\\W_]?[аa][\\W_]?[кk]";
String p ="***";
String newString = string.replaceAll(pattern, p);
System.out.println(newString);
Комментариев нет:
Отправить комментарий