将String中的所有正则表达式匹配项替换为match的子字符串

PDS*_*tat 1 java

只是想知道对于给定的String这样是否有更好的解决方案,例如

xDLMContent <matches> something <and> dSecurityGroup <contains> somethingelse <and> xDLMSomeOtherMetaDataField <matches> anothersomethingelse
Run Code Online (Sandbox Code Playgroud)

它需要替换为

DLMContent <matches> something <and> SecurityGroup <contains> somethingelse <and> DLMSomeOtherMetaDataField <matches> anothersomethingelse
Run Code Online (Sandbox Code Playgroud)

规则为元数据字段以x或d开头​​,后跟大写字母,然后是1个或多个大小写混合的alpha字符。

这是我的解决方案,但我想知道是否还有更好的选择

public static void main(String[] args) {
    String s = "xDLMContent <matches> something <and> dSecurityGroup <contains> somethingelse <and> xDLMSomeOtherMetaDataField <matches> anothersomethingelse";
    Pattern pattern = Pattern.compile("[dx][A-Z][a-zA-Z]+");
    Matcher matcher = pattern.match(s);
    while (matcher.find()) {
        String orig = s.substring(matcher.start(), matcher.end());
        String rep = s.substring(matcher.start() + 1, matcher.end());
        s = s.replaceAll(orig, rep);
        matcher = pattern.match(s);
    }

    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

chr*_*con 7

使用replaceAll()效果很好。只需选择要保留的内容(括号中的部分()),然后使用$1

String f = s.replaceAll("[dx]([A-Z][a-zA-Z]+)", "$1");
Run Code Online (Sandbox Code Playgroud)

输出量

DLMContent <matches> something <and> SecurityGroup <contains> somethingelse <and> DLMSomeOtherMetaDataField <matches> anothersomethingelse
Run Code Online (Sandbox Code Playgroud)

  • 真好!我不知道那群“ $ 1”的骗局 (2认同)
  • 你知道是否有可能对这个组进行一些转换,比如:`replaceAll("[dx]([AZ][a-zA-Z]+)", someMethod("$1"))`?(显然,此代码不起作用 - 也许还有其他一些技巧) (2认同)