2011-09-15 106 views
7

我正在做一个小的javascript方法,它接收一个点的列表,并且我必须阅读这些点以在谷歌地图中创建一个Polygon。为什么这个JavaScript的正则表达式不起作用?

我收到的形式对这些点:

(纬度,经度),(纬度,经度),(纬度,经度)

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

\(\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中使用此代码时,结果中会收到空值?

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错误。此代码托管在包含的JS文件中的JavaScript函数中。该方法在OnLoad方法中调用。

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

回答

14

使用regex literal [MDN]

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 

这意味着表达式尝试匹配/sg字面上和括号()仍视为特殊字符。


更新:.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], 
    ... 
] 

当然,如果你想要的值作为字符串和不是数字,你可以省略+

+1

太棒了,它的工作!我不知道这个合成器。小问题:我收到一个结果数组,但是如何检索我的捕获“(...)”的内容?(this:([0-9 .-] +)) – J4N

+1

请参阅我的更新。 –

+1

非常感谢,我需要的是 – J4N

相关问题