App Script正则后行断言含量词报错:非固定宽度,求提取动态价格
解决Google App Script中提取标签value值的正则问题
问题根源
Google App Script采用的是RE2正则引擎,它不支持可变长度的后行断言——也就是后行断言((?<=...))内部不能使用+、*这类会导致匹配长度不固定的量词,这就是你遇到a quantifier inside a lookbehind makes it non fixed width错误的原因。
解决方案:用捕获组替代后行断言
最直接且兼容的方式是放弃后行断言,改用捕获组来提取目标数值。以下是具体实现:
正则表达式
针对带小数的价格(如31.74),可以使用:
<fin-streamer[^>]*value="(\d+\.\d+)"
如果需要同时兼容整数价格(如31),调整为:
<fin-streamer[^>]*value="(\d+(?:\.\d+)?)
Google App Script代码示例
function getTargetPrice() { // 替换为实际获取到的网页HTML内容 const pageHtml = UrlFetchApp.fetch("目标网页URL").getContentText(); // 匹配<fin-streamer>标签的value属性值 const priceRegex = /<fin-streamer[^>]*value="(\d+(?:\.\d+)?)"/; const priceMatch = pageHtml.match(priceRegex); if (priceMatch) { const targetPrice = priceMatch[1]; Logger.log("提取到的目标价格:" + targetPrice); // 这里可以添加后续处理逻辑 } else { Logger.log("未找到目标价格"); } }
正则说明
<fin-streamer[^>]*:匹配<fin-streamer标签开头,以及标签内除了闭合>之外的所有内容(跳过其他无关属性)value="(\d+(?:\.\d+)?):匹配value="开头的属性,将括号内的价格数值(整数或小数)捕获到第一个分组中- 最终通过
match[1]即可获取到目标价格
进阶:定位特定标签
如果页面中有多个<fin-streamer>标签,可以通过标签的其他属性缩小匹配范围,比如标签带有data-symbol="AAPL"属性:
<fin-streamer[^>]*data-symbol="AAPL"[^>]*value="(\d+(?:\.\d+)?)
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

