正则无法提取JS函数字符串中的数字192,求问题原因排查
从JavaScript函数字符串中提取数字192的问题解决
首先咱们先理清楚你的需求:从这段包含JS函数的字符串里精准提取出参数中的数字192,但你写的正则没返回内容,咱们一步步分析问题,再给出解决办法。
你的原问题场景
我想要从一段包含在字符串中的JavaScript函数里提取数字192,该字符串内容为:
var jsFunction = "function loadMarkers() { setMarker( \"Stadio Giuseppe Meazza\", 45.478083998442, 9.1239792108536, null, null, 192, null, null, null, null, \"/venues/italy/stadio-giuseppe-meazza---san-siro/v192/\" ); }"
我编写了正则表达式:loadMarkers[^\{]+(.*}),但该正则未返回任何内容,请问我哪里出错了?
你的正则为什么失效?
你的正则loadMarkers[^\{]+(.*})有两个核心问题:
- 方向完全偏离需求:你写的正则是想匹配整个
loadMarkers函数体,但你的目标是提取函数内部setMarker的某个参数,这个正则根本没定位到目标数字的位置,就算匹配成功也拿不到192。 - 匹配逻辑的细节问题:
[^\{]+是匹配除了左大括号{之外的所有字符,而loadMarkers()后面紧跟着的就是{,所以这部分只会匹配loadMarkers()(包含括号和后面的空格),然后(.*})会贪婪匹配从{到最后一个}的所有内容,但就算匹配到了整个函数体,也没捕获你要的数字。
正确的解决方案
因为192是setMarker函数的第6个参数(前5个分别是场馆名、两个坐标、两个null),咱们可以精准定位这个位置来捕获数字:
方案1:精准定位参数位置(最可靠)
直接匹配setMarker的前5个参数,然后捕获第6个参数的数字:
const targetStr = 'var jsFunction = "function loadMarkers() { setMarker( \"Stadio Giuseppe Meazza\", 45.478083998442, 9.1239792108536, null, null, 192, null, null, null, null, \"/venues/italy/stadio-giuseppe-meazza---san-siro/v192/\" ); }"'; // 正则逻辑:匹配setMarker(,然后跳过前5个参数,捕获第6个的数字 const extractRegex = /setMarker\([^)]+,[^)]+,[^)]+,[^)]+,[^)]+,(\d+),/; const result = targetStr.match(extractRegex); if (result) { console.log(result[1]); // 输出:192 }
正则解释:
setMarker\(:精准匹配setMarker(的开头[^)]+,:匹配除了)之外的任意字符直到逗号,重复5次(对应前5个参数)(\d+):捕获连续的数字,也就是咱们要的192,:匹配参数后面的逗号,确保咱们捕获的是完整的第6个参数
方案2:更灵活的匹配(应对参数位置可能变化的情况)
如果担心参数位置可能变动,且192是参数列表里唯一的独立整数(不是字符串里的v192),可以用正则排除引号内的内容,避免误抓字符串里的数字:
const extractRegex = /setMarker\((?:[^"\\]|\\.)*,(?:[^"\\]|\\.)*,(?:[^"\\]|\\.)*,(?:[^"\\]|\\.)*,(?:[^"\\]|\\.)*,(\d+),/; const result = targetStr.match(extractRegex); if (result) { console.log(result[1]); // 输出:192 }
这个正则会跳过所有带引号的内容,确保咱们抓的是参数里的独立数字。
内容的提问来源于stack exchange,提问作者fido
相关产品推荐
相关产品推荐

