2011-09-15 102 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

相關問題