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”)
?(显然,此代码不起作用-可能还有其他一些技巧)