2010-05-23 116 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