web-dev-qa-db-ja.com

JavaおよびRegExを使用して文字列の大文字と小文字を変換します

問題:回転

"My Testtext TARGETSTRING My Testtext" 

"My Testtext targetstring My Testtext"

Perlは、replacement-stringで使用できる「\ L」操作をサポートしています。

パターンクラスはこの操作をサポートしていません:

このクラスでサポートされていないPerl構成:[...]前処理操作\ l\u、\ L、および\ U。 https://docs.Oracle.com/javase/10/docs/api/Java/util/regex/Pattern.html

36
Andreas

Java regexではこれを行うことはできません。 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"

appendReplacementappendTailに関する注意

上記のソリューションはsubstringを使用し、tailインデックスなどを管理することに注意してください。実際には、 Matcher.appendReplacement およびappendTail

    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, m.group().toUpperCase());
    }
    m.appendTail(sb);

sbStringBuffer ではなく StringBuilder になったことに注目してください。 MatcherStringBuilderオーバーロードを提供するまで、これらのメソッドを使用したい場合は、より遅いStringBufferに悩まされます。

効率を下げて可読性を高めるというトレードオフが価値があるかどうかは、あなた次第です。

こちらもご覧ください

57

regexpキャプチャグループ を使用できます(本当に正規表現を使用する必要がある場合、つまり、 "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
VonC

Java9 +

Java 9+から使用できます String :: replaceAll を使用できますFunction<MatchResult, String>たとえば、 polygenelubricants の例を使用します。

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
     ^^      ^                  ^^^
6
YCF_L

正規表現レベルでこれを行うには、\Uを使用して大文字モードをオンにし、\Eを使用してオフにする必要があります。 IntelliJ IDEA find-and-replaceダイアログでこの機能を使用する方法の例を次に示します。これは、クラスフィールドのセットをJUnitアサーションに変換します(IDEツールチップはfind-and-replace変換の結果):

enter image description here

5
Andriy Kryvtsun

Java 8」のこの変換関数はどうですか

/**
 * Searches the given pattern in the given src string and applies the txr to the
 * matches
 * 
 * @param src     The string to be converted
 * @param pattern the pattern for which the transformers to be applied.
 * @param txr     The transformers for the mathed patterns.
 * @return The result after applying the transformation.
 */
private static String fromTo(String src, String pattern, Function<String, String> txr) {
    Matcher m = Pattern.compile(pattern).matcher(src);

    StringBuilder sb = new StringBuilder();
    int last = 0;

    while (m.find()) {
        sb.append(src.substring(last, m.start()));
        sb.append(txr.apply(m.group(0)));
        last = m.end();
    }
    sb.append(src.substring(last));
    return sb.toString();
}
0