【问题标题】:replace all captured groups替换所有捕获的组
【发布时间】:2011-10-09 08:27:44
【问题描述】:

我需要将类似:"foo_bar_baz_2" 转换为 "fooBarBaz2"

我正在尝试使用此模式:

Pattern pattern = Pattern.compile("_([a-z])");
Matcher matcher = pattern.matcher("foo_bar_baz_2");

是否可以使用matcher 将第一个捕获的组('_'后面的字母)替换为大写的捕获组?

【问题讨论】:

  • 是的,有可能(我想比我更了解 Java 的人也可以告诉你如何)。我只是想指出,使用该正则表达式,您将得到 fooBarBaz_2,因为 [a-z]2 不匹配。

标签: java regex capturing-group


【解决方案1】:

您可以像这样使用匹配器的 appendReplacement/appendTail 方法:

Pattern pattern = Pattern.compile("_([a-z0-9])");
Matcher matcher = pattern.matcher("foo_bar_baz_2");

StringBuffer stringBuffer = new StringBuffer();
while(matcher.find()) {
    matcher.appendReplacement(stringBuffer, matcher.group(1).toUpperCase());
}
matcher.appendTail(stringBuffer);

System.out.println(stringBuffer.toString());

【讨论】:

    【解决方案2】:
    StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
    }
    matcher.appendTail(sb);
    

    【讨论】:

      【解决方案3】:

      是的。替换为\U$1\E - 表示为Java字符串"\\U$1\\E"

      只要您的正则表达式中没有其他内容,您就可以转储 \E 并缩短为 \U$1


      考虑到@TimPietzcker 的评论,您的正则表达式本身应该是"_([a-z0-9])"

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2018-12-28
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多