使用 Java 和正则表达式转换字符串中的大小写

2022-09-01 01:56:09

问题:转弯

"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


答案 1

你不能在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"

关于和的说明appendReplacementappendTail

请注意,上述解决方案使用和管理索引等。事实上,如果你使用 Matcher.appendReplacement 和 .,你可以不用这些。substringtailappendTail

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

请注意,现在是 StringBuffer 而不是 StringBuilder。在提供重载之前,如果要使用这些方法,您将遇到较慢的重载。sbMatcherStringBuilderStringBuffer

由您决定是否值得以较低的效率换取更高的可读性。

另请参见


答案 2

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

enter image description here