我一整夜都在寻找,但其他答案都没有满足我的需求。他们甚至不会跑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+">");
}
答案 0 :(得分:1)
content = content.replaceAll("<tag>(.*?)</tag>", value);
已编辑回答接受来自参数的标记:
content = content.replaceAll("<"+tag"+">(.*?)</"+tag+">", value);
答案 1 :(得分:1)
它不起作用,因为您使用的模式(.?+)
有点奇怪,它意味着匹配任何字符.
可选?
一次或多次+
检查{{ 3}},要解决您的问题,您必须进行一些可以使用的更改:
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”,reslt是:
<tag_name>XXXX</tag_name>