为什么这个javascript正则表达式不起作用?

J4N*_*J4N 8 javascript regex

我正在做一个小的javascript方法,它接收一个点列表,我将阅读这些点以在谷歌地图中创建一个多边形.

我在表格上收到了以下内容:

(lat,long),(lat,long),(lat,long)

所以我做了以下正则表达式:

\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)
Run Code Online (Sandbox Code Playgroud)

我用RegexPal和我收到的确切数据进行了测试:

(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)
Run Code Online (Sandbox Code Playgroud)

它的工作原理,那么为什么当我在我的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);
Run Code Online (Sandbox Code Playgroud)

我执行时没有javascript错误(使用谷歌浏览器的调试模式).此代码托管在javascript函数中,该函数位于包含的JS文件中.在OnLoad方法中调用此方法.

我搜索了很多,但我找不到为什么这不起作用.非常感谢你!

Fel*_*ing 15

使用正则表达式文字[MDN]:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g;
Run Code Online (Sandbox Code Playgroud)

使用RegExp [MDN]时出现两个错误:

  • "分隔符" /不应该是表达的一部分
  • 如果将表达式定义为字符串,则必须转义反斜杠,因为它是字符串中的转义字符

此外,修饰符作为第二个参数传递给函数.

因此,如果您想使用RegExp(在这种情况下您不需要),等效的将是:

var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g");
Run Code Online (Sandbox Code Playgroud)

(我想你现在看到为什么正则表达式文字更方便了)


我总是发现RegExp在控制台中复制和过去表达式并查看其输出会很有帮助.以你原来的表达方式,我们得到:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g
Run Code Online (Sandbox Code Playgroud)

这意味着该表达式尝试匹配/,s以及g字面上和括号()仍然视为特殊字符.


更新: .match()返回一个数组:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
Run Code Online (Sandbox Code Playgroud)

这似乎不是很有用.

您必须使用.exec() [MDN]来提取数字:

["(25.774252, -80.190262)", "25.774252", "-80.190262"]
Run Code Online (Sandbox Code Playgroud)

必须重复调用,直到处理完整个字符串.

例:

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]]);
}
Run Code Online (Sandbox Code Playgroud)

这会创建一个数组数组,而一元加号(+)会将字符串转换为数字:

[
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ...
]
Run Code Online (Sandbox Code Playgroud)

当然,如果您希望将值作为字符串而不是数字,则可以省略+.