42

問題: ターン

"My Testtext TARGETSTRING My Testtext" 

の中へ

"My Testtext targetstring My Testtext"

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

Pattern-Class はこの操作をサポートしていません:

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

4

5 に答える 5

60

Java 正規表現ではこれを行うことはできません。String.toUpperCase()代わりにandを使用して手動で後処理する必要があり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管理していることに注意してください。tailMatcher.appendReplacementappendTail

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

がではなく にsbなっていることに注意してください。オーバーロードを提供するまで、これらのメソッドを使用したい場合は、より遅いものに固執します。StringBufferStringBuilderMatcherStringBuilderStringBuffer

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

こちらもご覧ください

于 2010-05-05T06:13:40.450 に答える
8

regexp キャプチャ グループを使用できます(本当に正規表現を使用する必要がある場合、つまり、" TARGETSTRING" が十分に複雑であり、正規表現によって検出されることを正当化するのに十分な「規則的」である場合)。次に、グループ #1 に
応募します。toLowerCase()

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);
  }
}
于 2010-05-05T06:13:27.113 に答える
8

Java9+

Java 9 以降では、 Matcher::replaceAllを使用できます。たとえば、 polygenelubricantsFunction<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
     ^^      ^                  ^^^
于 2018-04-26T13:43:05.657 に答える