2010-05-23 111 views
4

例如,對於該字符串,正則表達式:匹配的空格不包含在[]

div.img-wrapper img[title="Hello world"] 

我要匹配的第一空間,但不是所述第二空間(被封裝在[]) 。什麼是正則表達式?

+1

需要CSS解析器? – kennytm 2010-05-23 18:35:14

+0

類別。我正在使用xpath轉換器的CSS選擇器。 Zend框架附帶一個CSS選擇器到xpath轉換器,但是它很麻煩。 – powerboy 2010-05-23 18:38:36

回答

4

以下表達式將通過使用前瞻斷言來完成工作。

_(?>[^[\]]*(\[|$)) 

下劃線代表一個空格。此表達式不支持嵌套括號,因爲正則表達式不足以表達嵌套匹配結構。

_   Match the space and 
(?>  assert that it is not inside brackets 
    [^[\]]* by matching all characters except brackets 
    (  followed by either 
    \[  an opening bracket (a space inside brackets 
      will have a closing bracket at this position) 
    |  or 
    $  or no more characters (end of line). 
) 
) 

UPDATE

下面是一個使用負先行斷言另一個(更漂亮)的解決方案。

_(?![^[\]]*]) 

它斷言空格後的下一個括號不是右括號。

+0

_(?![^ [\]] *])上嘗試,我會檢測所有空間。它可以斷言_沒有跟隨],但它可以斷言它沒有前面的[。但無論如何,它服務於這個建議。我只是想知道如何將lookahead斷言與lookbehide斷言結合起來 – powerboy 2010-05-23 19:13:15

+0

沒有打開括號的斷言背後的負面看法必須是類似於(?<!\\ [[^ [\\\]] *),但是如果我正確記得使用+和*不允許放在斷言之後。因此,可能不可能在斷言後面使用否定的外觀來檢查沒有左括號。 – 2010-05-23 19:20:27

0

不匹配(拆分?)空間。相反,匹配它的否定。

(?:(?:\[[^\]]*\])|\S)+ 

這不是爲了匹配所有的CSS選擇器,只是你的例子。你應該得到一個CSS解析器來獲得可靠的結果。

+0

實際上,如果我在http://www.regextester.com/index2.html – 2010-05-23 19:23:31

相關問題