用于验证CSS选择器的正则表达式

时间:2010-09-30 21:53:39

标签: java regex css-selectors

什么是可用于验证CSS选择器的正则表达式,并且可以以无效选择器快速停止的方式执行此操作。

有效选择器:

EE
#myid
.class
.class.anotherclass
EE .class
EE .class EEE.anotherclass
EE[class="test"]
.class[alt~="test"]
#myid[alt="test"]
EE:hover
EE:first-child
E[lang|="en"]:first-child
EE#test .class>.anotherclass
EE#myid.classshit.anotherclass[class~="test"]:hover
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hover

选择器无效,例如在行尾包含额外的空格:

EE:hover   EE
EE .class EEE.anotherclass 
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov     9
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov  -daf

3 个答案:

答案 0 :(得分:4)

正则表达式是错误的工具。 CSS选择器是复杂的方式。 例如:

bo\
dy:not(.\}) {}

使用具有真实标记器的解析器,如下所示:PHP-CSS-Parser。将它重写为Java比正确使用正则表达式更容易。

答案 1 :(得分:1)

这是我在我的代码中使用的正则表达式:

[+>~, ]?\s*(\w*[#.]\w+|\w+|\*)+(:[\w\-]+\([\w\s\-\+]*\))*(\[[\w ]+=?[^\]]*\])*([#.]\w+)*(:[\w\-]+\([\w\s\-\+]*\))*

在标记后我使用trim函数删除多余的空格,例如:

表达式:

EE.class      EE#id.class

标记:

EE.class

   EE#id.class
修剪后的标记:

EE.class

EE#id.class

或者例如

> EE.class(当它是直接子节点时发出警报,然后我用任何子字符串代码处理)

其他例程可以检查令牌是否为数字,例如

您可以使用http://regexpal.com/进行测试。

答案 2 :(得分:0)

典型正则表达式的问题在于它们无法处理任意级别的嵌套。他们没有记忆。考虑一个字母数字的字符串,后跟相同数量的b:aaabbb和合理的正则表达式a*b*。当正则表达式到达第一个'b'时,它没有记忆它识别了多少个,因此它无法识别相同数量的b。

现在用()IFEND<x></x>等替换a和b ...然后你可以看到问题。