2012-12-10 21 views
0

我想匹配所有出現在某個圖案的字符串,正則表達式:正則表達式的Javascript所有出現

\d+ 

我的字符串是一個CSS規則,所以我知道它有一個屬性開始,應以分號結尾。我想得到中間的東西。

例如,在字符串中

margin: 0px 3px 2px; 

我希望得到:

0px 3px 2px 

我想喜歡的事:

margin:\s*?(\d+)px 

但它只匹配的第一個。然後我不知道怎麼說,在數字後面,可以是兩個字符(em | px),只有一個(%)或者什麼也沒有。

任何正則表達式的大師可以幫助我嗎?

我更願意打開一個新的問題,但這個職位是與我previuos這裏:你應該嘗試margin:.*?;

背部參考類似

margin:(.*?);CSS Regular Expression

+0

斯普利特':',然後通過空格分開。你應該得到一個包含0px,3px,2px令牌的數組。上面的「解決方案」可能適用於或不適用於所有情況,因爲我不知道CSS規則的確切格式,因此您需要查看規範。 – nhahtdh

回答

1

如何:

// returns array: ["0px", "3px", "2px"] 
"margin: 0px 3px 2px;".match(/\d+(?:px|em)?/g) 

使用g(全局)標誌來匹配整個字符串,而不是在第一次匹配時停止。

// other example - returns array: ["3em", "2px", "39"] 
"margin: 3em 2px 39;".match(/\d+(?:px|em)?/g) 

爲了進一步闡明如何工作的:

  • \d+比賽號碼(以下一個或多個相互)
  • (?:px|em)?跳過捕捉(但仍然匹配!)這組 - 查找PX或em字符串。最後的問號表示可能找不到整個組(有數字時沒有單位)。

編輯:從下面的評論回答OP的擔憂。

這樣做:new RegExp(/\d+(?:px|em)?/g).exex(mystring)不起作用由於兩個原因。 首先 - 從另一個創建新的RegExp時不能提供標誌(g)(這裏是這種情況 - /\d+(?:px|em)?/g等同於RegExp對象,就像[]相當於new Array()。使用new RegExp構造創建RegExp對象的正確方法是傳遞兩個字符串參數:第一個是pattern,第二個是flags,所以它會變成:new RegExp('\d+(?:px|em)?', 'g')。 第二件事是.exec()方法總是返回第一個匹配(不是全部),所以它不適用於你之後的內容。

因此,要重用幾個在你的腳本,你必須把它分配給變量的地方是正則表達式,然後傳遞給.match()功能。它看起來是這樣的:

var reg = new RegExp('\d+(?:px|em)?', 'g'); 
// somewhere down the road... 
mystring.match(reg); 
// and on some other string... 
myotherstring.match(reg); 
+0

This works ... Sincerly我不明白爲什麼這個工程「mystring.match(/ \ d +(?: px | em)?/ g)」,這並不是新的RegExp(/ \ d +(?: px | em)?/ g).exex(mystring)..我要再次研究方法:)非常感謝你 – Davide

+0

我已經更新了我的答案,以解決你爲什麼用'new RegExp .. .'不起作用。 – WTK

0

也許你需要這樣的:

var re = /^\w+:(.+);$/; 
var st = "margin: 0px 3px 3px;"; 
re.exec(st); 

Regex Tester與它擺弄一下。 保持網站您的收藏夾以備將來使用