一尘不染

使用Java和RegEx将字符串转换为字符串

java

问题:转弯

"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


阅读 311

收藏
2020-09-08

共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

请注意,上述解决方案使用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如果要使用这些方法,您将受制于较慢的对象。

由您决定是否值得在效率较低的情况下取舍以提高可读性。

2020-09-08