如何用正则表达式匹配data-p标签内的数字列表?
解决方案
完全可以实现,两种思路任选:
1. 分步处理(先捕获data-p属性内容,再提取数字)
先匹配出整个data-p属性的内容,再从捕获到的内容里提取所有数字,逻辑更清晰:
- 第一步正则(匹配data-p属性值):
捕获组1会得到类似data-p="([^"]+)"["123","456","789"]的字符串。 - 第二步正则(从捕获内容中提取数字):
开启全局匹配("(\d+)"g标志),就能捕获到所有数字字符串,最后把它们组装成纯数字数组即可。
2. 单个正则直接提取所有目标数字
如果想用单个正则搞定,可以利用正向断言+全局匹配,直接定位到data-p属性内的所有数字:
(?<=data-p="\["|\G,")(\d+)(?="(?:,|\]))
- 解释:
(?<=data-p="\["|\G,"):正向后查,确保当前位置要么是data-p="[""的后面,要么是上一个匹配结果的,"后面,保证只匹配data-p属性内的数字。(\d+):捕获数字本身。(?="(?:,|\])):正向预查,确保数字后面是"加逗号或右括号,保证是合法的列表项。
示例代码(JavaScript)
const html = '<div data-p="["12","34","56"]"></div>'; // 分步处理 const dataPRegex = /data-p="([^"]+)"/; const match = html.match(dataPRegex); if (match) { const numRegex = /"(\d+)"/g; const nums = []; let numMatch; while ((numMatch = numRegex.exec(match[1])) !== null) { nums.push(Number(numMatch[1])); } console.log(nums); // [12, 34, 56] } // 单个正则全局匹配 const singleRegex = /(?<=data-p="\["|\G,")(\d+)(?="(?:,|\]))/g; const nums = Array.from(html.matchAll(singleRegex), m => Number(m[1])); console.log(nums); // [12, 34, 56]
内容的提问来源于stack exchange,提问作者nicolattu
相关产品推荐
相关产品推荐

