2011-06-23 37 views
2

我有一個字符串,我想用#, ., [], or {}字符來分割,就像在CSS中一樣。所需的功能是:

- 輸入: "div#foo[bar='value'].baz{text}"
- 輸出: ["div", "#foo", "[bar='value'", ".baz", "{text"]JavaScript正則表達式匹配引號內的字符而不是字符集

這是很容易的,這個正則表達式: input.match(/([#.\[{]|^.*?)[^#.\[{\]}]*/g)

然而,這並不能忽略引號內的語法特點,我也喜歡它。 (e.x. "div[bar='value.baz']"應該忽略.

如何使RegEx的第二部分([^#.\[{\]}]*部分)不僅捕獲取反的字符集,還捕獲引號內的任何字符。換句話說,我怎樣才能將RegEx,(\"|').+?\1應用到我的當前版本中。

編輯: 我已經想通了,工作體面,但不能處理轉義引號引號內(例如:"stuff here \\" quote ")正則表達式。如果有人知道如何做到這一點,那將是非常有幫助的:

str.match(/([#.\[{]|^.*?)((['"]).*?\3|[^.#\[\]{\}])*/g);

回答

2
var str = "div#foo[bar='value.baz'].baz{text}"; 
str.match(/(^|[\.#[\]{}])(([^'\.#[\]{}]+)('[^']*')?)+/g) 
// [ 'div', '#foo', '[bar=\'value.baz\'', '.baz', '{text' ] 
+0

這正是我所期待的,謝謝。 – Azmisov

+0

我稍微修改了它以處理'{}'內部的引號和'[]'內部多個'bar = value':'str.match(/(^ | [\。#[\] {}])(( [^ '\#[\] {}] +)('[^ '] *')|?( '[^'] *'))+ /克)' – Azmisov

0

首先,我不能強調這一點:你不應該使用正則表達式來解析CSS,你應該使用一個真正的解析器,例如http://glazman.org/JSCSSP/或類似的 - 許多人已經建立了他們,不需要你重新發明輪子。

中說,要解決當前的問題,做到這一點:

var str = "div#foo[bar='value.foo'].baz{text}"; 

str.match(/([#.\[{]|^.*?)(?:[^#\[{\]}]*|\.*)/g); 

//["div", "#foo", "[bar='value.foo'", ".baz", "{text"] 
+0

輸入字符串i實際上,沒有字面的CSS。我試圖編寫一個正則表達式,它可以按照上面列出的字符分割輸入字符串。我想在分割中包含'.',但如果它們在引號內,則忽略它(或上面列出的任何字符)。 – Azmisov

2
var tokens = myCssString.match(/\/\*[\s\S]*?\*\/|"(?:[^"\\]|\\[\s\S]*)"|'(?:[^'\\]|\\[\s\S])*'|[\{\}:;\(\)\[\]./#]|\s+|[^\s\{\}:;\(\)\[\]./'"#]+/g); 

鑑於你的字符串,它產生

div 
# 
foo 
[ 
bar= 
'value.foo' 
] 
. 
baz 
{ 
text 
} 

上述正則表達式是鬆散的基礎上CSS 2.1 lexical grammar