2013-01-05 12 views
0

我有一個快速問題給你(對於你,我個人花了幾個小時)。我在Javascript/Jquery中創建了一個Web應用程序來驗證CSS樣式表。Javascript和正則表達式,倍數匹配

我需要使用Regex從選擇器中提取多個CSS類名稱。我做一樣的東西:

var selector = this.value; 
var userNewClass = selector.match(/[.]([A-Za-z_-]*)/); 
alert(userNewClass.toString()); 

這幾乎工作,但我的代碼(你在這裏有一個正則表達式小白)的兩個問題。 如果我寫的是這樣的:

.test:hover 

它返回我

.test, test 

相同的類名,但與點和其他沒有點。 如果我寫了多組類名稱的選擇:

.test, .hello 

我得到同樣的結果......反正是有修改我的正則表達式(或我的代碼?),以獲得所有點的類名(。),考慮到用戶可以在同一個選擇器中擁有無限數量的類。

+0

我想你應該只是將'dot'移到捕獲組中: -// [[]] [A-Za-z _-] *)/' –

+0

如果我爲'body添加了一個規則集.about'或'.button.disabled'? – Popnoodles

回答

2

.test是完整匹配,test是被捕獲的組(任何東西在parens ())。在結束/之後,還需要在末尾添加g以匹配每個實例,而不僅僅是第一個實例。

也就是說,你可能不需要這個正則表達式,並且可以更好地在字符串上使用split

'.test, .hello'.split(', ') // returns an array ['.test', '.hello'] 

如果你絕對必須使用正則表達式,試試這個:

/\.(\w+)/g 

這將匹配(和捕獲)的一個或多個字母和/或數字\w+隨後文字.任何和所有序列

+2

有關匹配結果數組的詳細信息,請查看[MDN的RegExp.exec()']表(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/ RegExp/exec#Description)(與'String.match()'返回的結構相同)另外,如果你想單獨處理所有匹配的捕獲組,你需要在某些地方使用'RegExp.exec()'循環:while((m = re.exec(s))!== null){/ * inspect m * /}'。 –

+0

太棒了!其實,我需要正則表達式,因爲@popnoodles所說的選擇器可以是'em.test:hover,em.hello:first-letter'。對不起,我不清楚這一點。 「g」解決方案非常完美!非常感謝。 – jthel

0

你將不得不使用RegExp.exec方法:

var input = ".test1.test2 .test3, .test4"; 

var re = /\.[\w\-]+/ig, match, matches = []; 

while (match = re.exec(input)) { 
    matches.push(match[0]); 
} 

alert(matches); 

使用拆分將不起作用,因爲您將不得不解析僞類和所有其他可能的CSS語法元素。