我正在做一个小的javascript方法,它接收一个点列表,我将阅读这些点以在谷歌地图中创建一个多边形。
我在表格上收到了这些意见:
(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错误(使用谷歌浏览器的调试模式)。此代码托管在javascript函数中,该函数位于包含的JS文件中。在OnLoad方法中调用此方法。
我搜索了很多,但我找不到为什么这不起作用。非常感谢你!
答案 0 :(得分:14)
var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
使用RegExp
[MDN]时出现两个错误:
/
不应该是表达式的一部分此外,修饰符作为第二个参数传递给函数。
因此,如果你想使用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
,而parens ()
仍被视为特殊字符。
更新: .match()
返回一个数组:
["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
似乎不是很有用。
您必须使用.exec()
[MDN]来提取数字:
["(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],
...
]
当然,如果您希望将值作为字符串而不是数字,则可以省略+
。