如何从包含多个link字段的字符串中提取所有对应路径子串?
提取字符串中所有匹配的link路径
嗨,我懂你现在的需求——从那个长字符串里把所有"link":"xxx"格式里的路径都提取出来,而不是只拿到最后一个对吧?原来的lastIndexOf只能定位到最后一个匹配项,所以只能得到/new,咱们用两种实用的方法来解决这个问题:
方法一:使用正则表达式(最简洁)
正则表达式可以全局匹配所有符合"link":"xxx"格式的内容,然后提取出我们需要的路径部分:
var data = 'xxxxxxxxxxxxxxxxx"link":"/main","link":"/old"xxxxxxxxxxxxxxxxxxxxx"link":"/new"xxxxx'; // 定义正则:匹配"link":"后面的非引号内容 const linkRegex = /"link":"([^"]+)"/g; const extractedLinks = []; let matchResult; // 循环遍历所有匹配结果 while ((matchResult = linkRegex.exec(data)) !== null) { // matchResult[1]是捕获组里的路径内容 extractedLinks.push(matchResult[1]); } console.log(extractedLinks); // 输出: ["/main", "/old", "/new"]
正则说明:
"link":":精准匹配固定前缀([^"]+):捕获所有不是双引号的字符(也就是我们要的路径,因为路径被双引号包裹)/g:开启全局匹配模式,让正则能找到所有符合条件的内容
方法二:循环查找位置(直观易懂)
如果你对正则不太熟悉,可以用indexOf循环遍历字符串,逐个定位并提取路径:
var data = 'xxxxxxxxxxxxxxxxx"link":"/main","link":"/old"xxxxxxxxxxxxxxxxxxxxx"link":"/new"xxxxx'; const targetPrefix = 'link":"'; const results = []; let currentSearchPos = 0; while (true) { // 找到当前位置之后的第一个targetPrefix的起始索引 const prefixStart = data.indexOf(targetPrefix, currentSearchPos); if (prefixStart === -1) break; // 找不到匹配项就退出循环 // 计算路径的起始位置:前缀结束后的第一个字符 const pathStart = prefixStart + targetPrefix.length; // 找到路径后面的第一个双引号(路径的结束位置) const pathEnd = data.indexOf('"', pathStart); if (pathEnd === -1) break; // 异常情况:找不到结束引号,直接退出 // 提取路径并加入结果数组 results.push(data.substring(pathStart, pathEnd)); // 更新搜索起始位置,避免重复匹配 currentSearchPos = pathEnd + 1; } console.log(results); // 输出: ["/main", "/old", "/new"]
逻辑说明:
- 每次从当前位置开始查找
link":"的位置 - 找到后计算路径的起始点,再定位路径末尾的双引号
- 提取中间的路径内容,然后把搜索位置移到结束引号之后,继续查找下一个匹配项
- 直到找不到
link":"为止,退出循环
内容的提问来源于stack exchange,提问作者naham 3k
相关产品推荐
相关产品推荐

