Используйте Java и RegEx, чтобы преобразовать регистр в строку - PullRequest
33 голосов
/ 05 мая 2010

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

"My Testtext TARGETSTRING My Testtext" 

в

"My Testtext targetstring My Testtext"

Perl поддерживает "\ L" -операцию, которую можно использовать в строке замены.

Pattern-Class не поддерживает эту операцию:

Конструкции Perl, не поддерживаемые этим классом: [...] Операции предварительной обработки \ l \ u, \ L и \ U. https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html

Ответы [ 4 ]

53 голосов
/ 05 мая 2010

Вы не можете сделать это в регулярном выражении Java. Вам нужно будет выполнить постобработку вручную, используя String.toUpperCase() и toLowerCase().

Вот пример того, как вы используете регулярное выражение, чтобы найти и использовать в предложении слова длиной не менее 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, если хотите использовать эти методы.

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

Смотри также

8 голосов
/ 05 мая 2010

Вы можете использовать группу захвата регулярного выражения (если вам действительно нужно использовать регулярное выражение, то есть, если «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);
  }
}
5 голосов
/ 26 апреля 2018

Java9 +

В Java 9+ вы можете использовать String :: replaceAll , где вы можете использовать Function<MatchResult, String>, например, мы используем пример полигеномасляных смазок :

String text = "this is just a test which upper all short words";
String regex = "\\b\\w{0,3}\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
String result = matcher.replaceAll(matche -> matche.group().toUpperCase());

System.out.println(result);

Или просто:

String result = Pattern.compile(regex)
        .matcher(text)
        .replaceAll(matche -> matche.group().toUpperCase());

выход

this IS just A test which upper ALL short words
     ^^      ^                  ^^^
4 голосов
/ 02 февраля 2017

Чтобы сделать это на уровне регулярного выражения, вы должны использовать \U, чтобы включить режим ввода заглавных букв, и \E, чтобы отключить его. Вот пример того, как использовать эту функцию в диалоговом окне IntelliJ IDEA find-and-replace, которое преобразует набор полей класса в утверждения JUnit (в подсказке IDE результат преобразования find-and-replace):

enter image description here

...