使用Java和RegEx转换字符串中的大小写

新手上路,请多包涵

问题:转

"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

原文由 Andreas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 360
2 个回答

您不能在 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

Note that the above solution uses substring and manages a tail index, etc. In fact, you can go without these if you use Matcher.appendReplacement and appendTail

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

注意 sb 现在是 StringBuffer 而不是 StringBuilder 。直到 Matcher 提供 StringBuilder 重载,如果你想使用这些方法,你就只能使用较慢的 StringBuffer

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

也可以看看

原文由 polygenelubricants 发布,翻译遵循 CC BY-SA 3.0 许可协议

Java9+

从 Java 9+ 开始,您可以使用 Matcher::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
     ^^      ^                  ^^^

原文由 Youcef Laidani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题