JavaScript提取子字符串问题:从指定标签串中获取目标内容
解决提取所有内容的问题
嘿,我知道你现在的问题啦——你的代码只能拿到最后一个<TagId>里的PQR,没法把ABC也提取出来对吧?我来给你分析下问题出在哪,再给你几个好用的解决办法~
问题根源
你当前代码的问题在于每次循环都用了lastIndexOf,这会一直定位到字符串最后一个<TagId>的位置,而且循环里每次都把新值覆盖给val,所以不管循环多少次,最后只会留下最后一次的结果(也就是PQR)。
解决方案1:用正则全局匹配(最简洁高效)
直接用正则表达式的全局匹配能力,一次性提取所有<TagId>标签里的内容:
var myString = "<TagId>ABC</TagId><TagId>PQR</TagId></Tags>"; // 正则匹配:捕获<TagId>和</TagId>之间的内容 const regex = /<TagId>([^&]+)<\/TagId>/g; let match; const results = []; // 循环提取所有匹配项 while ((match = regex.exec(myString)) !== null) { results.push(match[1]); // 取出捕获组里的内容(ABC/PQR) } console.log(results.join(' ')); // 输出 "ABC PQR"
这个正则的逻辑是:
<TagId>匹配开头的标签([^&]+)捕获标签内的内容(直到遇到&为止,因为后面紧跟</TagId>)<\/TagId>匹配结束标签g标志开启全局匹配,exec会循环找到所有符合条件的内容
解决方案2:改进你的循环逻辑
如果你想保留原来的循环思路,可以每次处理完一个标签后,把字符串截取到当前结束标签的后面,这样下一次循环就能处理下一个标签:
var myString = "<TagId>ABC</TagId><TagId>PQR</TagId></Tags>"; var count = ((myString.match(new RegExp("<TagId>", "g")) || []).length); const results = []; let currentStr = myString; for(var i = 1; i <= count; i++){ // 找当前字符串里第一个<TagId>的位置 const startIndex = currentStr.indexOf("<TagId>") + 7; // 找对应的</TagId>位置 const endIndex = currentStr.indexOf("</TagId>"); // 提取内容 const val = currentStr.substring(startIndex, endIndex); results.push(val); // 截取字符串,去掉已经处理过的部分(</TagId>长度是10) currentStr = currentStr.substring(endIndex + 10); } console.log(results.join(' ')); // 输出 "ABC PQR"
解决方案3:用正向/反向断言简化正则
ES6及以上支持断言语法,可以更简洁地提取内容:
var myString = "<TagId>ABC</TagId><TagId>PQR</TagId></Tags>"; // 直接匹配<TagId>之后、</TagId>之前的内容 const matches = myString.match(/(?<=<TagId>)[^&]+(?=<\/TagId>)/g) || []; console.log(matches.join(' ')); // 输出 "ABC PQR"
这里的(?<=<TagId>)是正向断言,确保前面是<TagId>标签;(?=<\/TagId>)是正向断言,确保后面是</TagId>标签,这样match会直接返回所有符合条件的内容数组。
内容的提问来源于stack exchange,提问作者gooner_psy
相关产品推荐
相关产品推荐

