Нужна в помощь с Regex'ом в Java
Есть такое задание: нам дано определенный текст, и нам нужно удалить слова которые имеют n-длинну и начинаются на согласную букву. У меня получился вот такой regex:
"[\\s]?\\b[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z][\\w\\-']{" + (WORD_LENGTH - 1) + "}\\b"
Где WORD_LENGTH - это длинна слов, которых нужно удалить.
но проблема следующая, если у нас будет предложение, например
"tool that you can use to your advantage. It is, therefore, wise to explore the"
то в результате получится:
" you can use to advantage. It is, therefore, to explore the"
То есть в результате лишний пробел, как можно избавиться от него?
Ответы (2 шт):
Проще использовать String::trim для удаления лишних пробелов в начале строки после замены.
Также можно использовать более короткую запись регулярного выражения для определения согласных букв в начале слова (на английском) с флагом (?i) для игнорирования регистра:
public static String fix(int len, String str) {
return str.replaceAll("(?i)\\s*\\b[b-z&&[^eiou]][\\w\\-']{" + (len - 1) + "}\\b", "")
.trim();
}
System.out.printf("'%s'%n",
fix(4, "Tool that you can use to your advantage. It is, therefore, wise to explore the DOOM.")
);
// 'you can use to advantage. It is, therefore, to explore the.'
Если вам хочется всё сделать в регулярном выражении, придётся повторить шаблоны для того, чтобы отдельно найти совпадение в начале строки (тогда надо захватить и пробелы справа) и в её конце:
^(?:\s*\b[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z][\w\-']{3})+\s*|\s*\b[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z][\w\-']{3}\b(?:\s+$)?
В коде можно использовать переменную:
String tokenRegex = "[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z][\\w\\-']{" + (WORD_LENGTH - 1) + "}";
String regex = "^(?:\\s*\\b" + tokenRegex + ")+\\s*|\\s*\\b" + tokenRegex + "\\b(?:\\s+$)?";
Чтобы не удалять переносы на новую строку, нужно заменить \s на \h.