我正在做一个小的javascript方法,该方法会接收到一个点列表,并且我必须阅读这些点才能在Google地图中创建多边形。
我在表格上收到这些要点:
(lat,long),(lat,long),(lat,long)
因此,我完成了以下正则表达式:
\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)
我已经使用RegexPal和收到的确切数据进行了测试:
(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)
并且它可以正常工作,所以为什么当我在JavaScript中添加此代码后,结果中会收到null?
var polygons="(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)"; var reg = new RegExp("/\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g"); var result = polygons.match(reg);
我执行时没有javascript错误(使用Google chrome的调试模式)。此代码托管在包含的JS文件中的javascript函数中。在OnLoad方法中调用此方法。
我已经搜索了很多,但是找不到为什么这不起作用。非常感谢你!
使用正则表达式文字[MDN] :
var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
使用RegExpMDN时出现两个错误:
RegExp
/
此外,修饰符作为第二个参数传递给函数。
因此,如果您要使用RegExp(在这种情况下不必使用),则等效项为:
var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");
(我想现在您知道为什么正则表达式文字更方便了)
我总是发现RegExp在控制台中复制和粘贴表达式并查看其输出会有所帮助。以您的原始表达,我们得到:
/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g
这意味着表达式尝试匹配/,s并且g字面意义上的括号()仍被视为特殊字符。
s
g
()
更新: .match()返回一个数组:
.match()
["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
这似乎不是很有用。
您必须使用.exec()MDN提取数字:
.exec()
["(25.774252, -80.190262)", "25.774252", "-80.190262"]
必须重复调用它,直到处理完整个字符串为止。
例:
var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g; var result, points = []; while((result = reg.exec(polygons)) !== null) { points.push([+result[1], +result[2]]); }
这将创建一个数组数组,一元加号(+)将字符串转换为数字:
+
[ [25.774252, -80.190262], [18.466465, -66.118292], ... ]
当然,如果您希望这些值是字符串而不是数字,则可以省略+。