什么是可用于验证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
答案 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。
现在用(
和)
,IF
和END
,<x>
和</x>
等替换a和b ...然后你可以看到问题。