我整晚都在寻找,但其他答案都不能满足我的需求。他们甚至不运行http://regexr.com/ 。我正在寻找的是替换 <whatever> replace this stuff </whatever>
之间的所有内容
public void updateValue(String tag, String value) {
content = content.replaceAll("<"+tag+">(.?+)</"+tag+">", value);
}
public void updateValue(String tag, int value) {
content = content.replaceAll("<"+tag+">(.?+)</"+tag+">", value+"");
}
public void updateValue(String tag, File value) {
content = content.replaceAll("(&<"+tag+">=)[^&]*(&</"+tag+">=)", value.getPath());
}
它们根本不起作用。
编辑
当前的方法是通过正则表达式将标签及其内容一起删除。
private void replaceValue(String tag, String value) {
content = content.replaceAll("<"+tag+">(.*?)<\\/"+tag+">", "<"+tag+">"+value+"</"+tag+">");
}
最佳答案
它不起作用,因为您正在使用的模式 (.?+)
有点奇怪,它的意思是匹配任何字符.
可选?
一次或多次+
检查your regex here ,要解决您的问题,您必须进行一些可以使用的更改:
content = content.replaceAll("<"+tag+">(.+?)<\\/"+tag+">", value);
//--------------------------------------^^^---^^
所以你必须使用(.+?)
, (.?+)
,并且您必须空格 /
与 \/
.
编辑
在第二种情况下,您必须使用带有组的模式,因此您必须匹配第一个标签名称,然后匹配标签之间的值,然后匹配闭合标签,您可以使用以下内容:
private static void replaceValue(String tag, String value) {
String regex = "<(.*?)>(.*?)</(.*?)>";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
content = content.replaceAll(matcher.group(1), tag)
.replaceAll(matcher.group(2), value)
.replaceAll(matcher.group(3), tag);
}
System.out.println(content);
}
如果出现
String content = "<MySQL.port>3306</MySQL.port>";
并且 tag = "tag_name", value = "XXXX",结果是:
<tag_name>XXXX</tag_name>
关于Java正则表达式替换两个标签之间的所有内容,非XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410061/