Java 用匹配的子字符串替换字符串中的所有正则表达式匹配项

Java 用匹配的子字符串替换字符串中的所有正则表达式匹配项,java,Java,只是想知道如果给定一个字符串,是否有更好的解决方案,例如 xDLMContent <matches> something <and> dSecurityGroup <contains> somethingelse <and> xDLMSomeOtherMetaDataField <matches> anothersomethingelse xDLMContent something数据安全组somethingelse XDLMsome

只是想知道如果给定一个字符串,是否有更好的解决方案,例如

xDLMContent <matches> something <and> dSecurityGroup <contains> somethingelse <and> xDLMSomeOtherMetaDataField <matches> anothersomethingelse
xDLMContent something数据安全组somethingelse XDLMsomething其他元数据字段另一个somethingelse
它需要被替换为

DLMContent <matches> something <and> SecurityGroup <contains> somethingelse <and> DLMSomeOtherMetaDataField <matches> anothersomethingelse
DLMContent something安全组somethingelse DLMSomeOtherMetaDataField另一个somethingelse
规则元数据字段以x或d开头,后跟大写字母,然后是1个或多个混合字母

这是我的解决方案,但我想知道是否有更好的办法

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);
}
publicstaticvoidmain(字符串[]args){
String s=“xDLMContent something dSecurityGroup somethingelse XDLMsometherMetadataField anothersomethingelse”;
Pattern=Pattern.compile(“[dx][A-Z][A-zA-Z]+”);
匹配器匹配器=模式匹配;
while(matcher.find()){
String orig=s.substring(matcher.start(),matcher.end());
String rep=s.substring(matcher.start()+1,matcher.end());
s=s.replaceAll(原始,代表);
匹配器=模式匹配;
}
系统输出打印项次;
}
使用
replaceAll()
效果很好。只需选择您想要保留的部分(括号中的部分
()
),然后使用
$1

String f = s.replaceAll("[dx]([A-Z][a-zA-Z]+)", "$1");
输出

DLMContent <matches> something <and> SecurityGroup <contains> somethingelse <and> DLMSomeOtherMetaDataField <matches> anothersomethingelse
DLMContent something安全组somethingelse DLMSomeOtherMetaDataField另一个somethingelse
使用
replaceAll()
效果很好。只需选择您想要保留的部分(括号中的部分
()
),然后使用
$1

String f = s.replaceAll("[dx]([A-Z][a-zA-Z]+)", "$1");
输出

DLMContent <matches> something <and> SecurityGroup <contains> somethingelse <and> DLMSomeOtherMetaDataField <matches> anothersomethingelse
DLMContent something安全组somethingelse DLMSomeOtherMetaDataField另一个somethingelse

您知道是否有可能对该组执行某些转换,例如:
replaceAll(“[dx]”([a-Z][a-zA-Z]+)”,somethod(“$1”)
?(显然,此代码不起作用-可能还有其他技巧)您知道是否有可能对该组执行某些转换,例如:
replaceAll(“[dx]([a-Z][a-zA-Z]+”,someMethod($1”)
?(显然,此代码不起作用-可能还有其他一些技巧)