RegEx用于捕获和替换元素textContent

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

我想在两个示例中替换“name”节点的值。我使用正则表达式组来匹配它并替换。分组工作正在进行,但替换却没有。

input 1
<xml
   <user:address>.../</user:address>
   <user:name>foo</user:name>
</xml>

input 2

<xml
   <user:address>.../</user:address>
   <street:name>bar</street:name>
</xml>


private static final String NAME_GROUP = "name";
public static final Pattern pattern = Pattern.compile("<.*:name>" + "(?<" + NAME + ">.*)</.*:name>");

final Matcher nameMatcher = pattern.matcher(str);
final String s = nameMatcher.find() ? nameMatcher.group(NAME_GROUP) : null;
System.out.println(s);

//foo
//bar

现在当我更换

String output = nameMatcher.replaceFirst("hello")
 I get 
 hello</xml>

虽然我期待以下

<xml
       <user:address>.../</user:address>
       <user:name>hello</user:name>
    </xml>

对于这两个例子。为什么小组在工作但不能替换?

提问于
用户回答回答于

假设这只是一个示例,并且您没有尝试使用正则表达式解析XML,您可以使用此方法。这里我们匹配并捕获前面的字符串和后面的字符串在不同的捕获组中。在替换中,我们使用这些组的反向引用将before-string和after-string返回到最终输出中。

final String str = "<xml\n" + 
        "   <user:name>foo</user:name>\n" + 
        "   <user:address>.../</user:address>\n" + 
        "   <user:name>foo</user:name>\n" + 
        "</xml>";

final String NAME_GROUP = "name";
final Pattern pattern = Pattern.compile("(<[^:]+:name>)(?<" + NAME_GROUP + ">.*?)(</[^:]+:name>)");
final Matcher m = pattern.matcher(str);

StringBuilder sb = new StringBuilder();
while (m.find()) {
    if (m.group(NAME_GROUP) != null) {
        m.appendReplacement( sb, m.group(1) + "hello" + m.group(3) );
    }
}
m.appendTail(sb);

System.out.println(sb);

输出:

<xml
   <user:name>hello</user:name>
   <user:address>.../</user:address>
   <user:name>hello</user:name>
</xml>

热门问答

云通信创建群组,文档中说群组名最长30字符,但是11个汉字报错提示,群组名太长,该怎么解决?

嗨喽你好摩羯座
推荐
您好,这个问题要看你采用的是什么编码; 1、在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。 2、在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。 3、在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要...... 展开详请

使用 API 加固后为什么 apk 体积变大了好多?

推荐

加固增强了对抗性,修改了加密压缩算法,并且新增的文件都是加固必须的文件。

cdn支持http2回源吗?

嗨喽你好摩羯座
推荐

webim在移动端的兼容性怎么样呢?

嗨喽你好摩羯座
推荐
您好,确认下您的问题: 这里的兼容性是移动端的小程序还是web ? 1、web;Web 支持 IE 7+ ( Windows XP / Vista 除外),Chrome 7+,FireFox 3.6+,Opera 12+ 和 Safari 6+ 支持 2、小程序,支持 平台支持S...... 展开详请

请问一下 php怎么上传图片到腾讯云cos并返回图片路径 啊 ?

你可以直接调用COS的接口进行上传。 PUT Object接口进行上传。接口文档:https://cloud.tencent.com/document/product/436/7749 路径就是你上传的图片文件名和你的域名拼接。 比如: PUT /picture.jpg HTTP...... 展开详请

使用CDN之后出现一些列问题?

更新源站内容需要马上生效的话,需要做刷新操作 https://console.cloud.tencent.com/cdn/refresh 设置为A记录后,请求直接到源站,可能因为刚刚设置了A记录,解析还是有缓存,导致仍然解析到CDN了,可以ping测下域名,看解析到的ip是源站还...... 展开详请

扫码关注云+社区

领取腾讯云代金券