Проблема: поворот
"My Testtext TARGETSTRING My Testtext"
в
"My Testtext targetstring My Testtext"
Perl поддерживает "\L" - операция, которая может использоваться в замещающей строке.
Класс Шаблона не поддерживает эту операцию:
Конструкции Perl, не поддерживаемые этим классом: [...] операции предварительной обработки \l \u, \L, и \U. https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
Вы не можете сделать это в Java regex. Вам придется вручную выполнять постобработку, используя String.toUpperCase()
и toLowerCase()
вместо этого.
Вот пример использования regex для поиска и выделения заглавными буквами слов длиной не менее 3 в предложении
String text = "no way oh my god it cannot be";
Matcher m = Pattern.compile("\\b\\w{3,}\\b").matcher(text);
StringBuilder sb = new StringBuilder();
int last = 0;
while (m.find()) {
sb.append(text.substring(last, m.start()));
sb.append(m.group(0).toUpperCase());
last = m.end();
}
sb.append(text.substring(last));
System.out.println(sb.toString());
// prints "no WAY oh my GOD it CANNOT be"
appendReplacement
и appendTail
Обратите внимание, что вышеприведенное решение использует substring
и управляет индексом tail
, и т.д. На самом деле, вы можете обойтись без них, если будете использовать Matcher.appendReplacement
и appendTail
.
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toUpperCase());
}
m.appendTail(sb);
Обратите внимание, что sb
теперь является StringBuffer
вместо StringBuilder
. Пока Matcher
не предоставит перегрузки StringBuilder
, вы будете вынуждены использовать более медленный StringBuffer
, если хотите использовать эти методы.
Вам решать, стоит ли искать компромисс между меньшей эффективностью и большей удобочитаемостью.
Вы можете использовать группу захвата регулярного выражения (если вам действительно нужно использовать регулярное выражение, то есть если " TARGETSTRING
"достаточно сложный и" регулярный ", чтобы оправдать обнаружение регулярным выражением).
Затем вы примените toLowerCase ()
к группе №1.
import java.util.regex.*;
public class TargetToLowerCase {
public static void main(String[] args) {
StringBuilder sb= new StringBuilder(
"my testtext TARGETSTRING my testtext");
System.out.println(sb);
String regex= "TARGETSTRING ";
Pattern p = Pattern.compile(regex); // Create the pattern.
Matcher matcher = p.matcher(sb); // Create the matcher.
while (matcher.find()) {
String buf= sb.substring(matcher.start(), matcher.end()).toLowerCase();
sb.replace(matcher.start(), matcher.end(), buf);
}
System.out.println(sb);
}
}