Используйте Java и RegEx для преобразования преобразования регистра в строке

Проблема: поворот

"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

35
задан user85421 29 August 2018 в 20:00
поделиться

2 ответа

Вы не можете сделать это в 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, если хотите использовать эти методы.

Вам решать, стоит ли искать компромисс между меньшей эффективностью и большей удобочитаемостью.

См. также

56
ответ дан 27 November 2019 в 06:54
поделиться

Вы можете использовать группу захвата регулярного выражения (если вам действительно нужно использовать регулярное выражение, то есть если " 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);
  }
}
8
ответ дан 27 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: