42

问题:转弯

"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

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"

注意appendReplacementappendTail

请注意,上述解决方案使用substring和管理tail索引等。实际上,如果使用Matcher.appendReplacementand ,则可以不使用这些appendTail

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

注意sb现在是 aStringBuffer而不是StringBuilder. 直到Matcher提供重载,如果你想使用这些方法StringBuilder,你就会被速度较慢的卡住。StringBuffer

是否值得以较低的效率换取较高的可读性,这取决于您。

也可以看看

于 2010-05-05T06:13:40.450 回答
12

要在正则表达式级别上执行此操作,您必须使用\U打开大写模式并将\E其关闭。这是一个如何在 IntelliJ IDEAfind-and-replace对话框中使用此功能的示例,该对话框将类字段集转换为 JUnit 断言(在 IDE 工具提示中是find-and-replace转换的结果):

在此处输入图像描述

于 2017-02-02T02:51:15.487 回答
8

您可以使用正则表达式捕获组(如果您真的需要使用正则表达式,也就是说,如果“ 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);
  }
}
于 2010-05-05T06:13:27.113 回答
8

Java9+

从 Java 9+ 开始,您可以使用Matcher::replaceAllFunction<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
     ^^      ^                  ^^^
于 2018-04-26T13:43:05.657 回答
0

“ 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();
}
于 2019-10-15T14:25:38.420 回答