2010-09-30 3 views
0

Что такое регулярное выражение, которое можно использовать для проверки CSS-селектора и может сделать это так, чтобы недействительный селектор быстро остановился.Регулярное выражение, которое проверяет селектор 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 
+2

Возможно, вы сможете написать RE для этого, но уверены ли вы, что писать грамматический синтаксический анализатор не будет лучше? – zigdon

+0

Я как раз собирался опубликовать ответ на ваш другой вопрос, но вы его удалили. –

+0

* «Недействительные селекторы, например, содержат лишние пробелы в конце строки:« * Какая это будет строка? Я никогда не сталкивался с парсером CSS (например, для файла CSS, атрибута стиля и т. Д.), Который имел проблемы с завершающим пробелом. –

ответ

3

Регулярные выражения являются неправильным инструментом. Селекторы CSS являются сложными. Пример:

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

Используйте анализатор с реальным Tokenizer, как этот: PHP-CSS-Parser. Легче переписать его на Java, чем правильно использовать регулярное выражение.

0

Проблема с типичным регулярным выражением yer заключается в том, что они не могут обрабатывать произвольные уровни вложенности. У них нет памяти. Рассмотрим строку некоторого числа a, за которой следует одно и то же число b: aaabbb и разумное регулярное выражение a*b*. Когда регулярное выражение попадает в первый «b», у него нет памяти, сколько его признано, и поэтому он не может распознать одинаковое количество букв.

Теперь заменить а и Ь с ( и ), IF и END, <x> и </x> и т.д ... и вы можете увидеть проблему.

+0

Я помню, как Джефф Этвуд говорил о том, что не написал XML-парсер с RegEx только по этой причине.Я просто спрашивал о селекторе, который имеет простую грамматику. Пример: tag # id.aClass.anotherClass: псевдокласс [matching = "element"]. Который мог иметь второй селектор, но пока есть один или несколько, вам все равно. – Sarabjot

1

Это регулярное выражение, которое я использую в своих кодах:

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

После Разбивается на лексемы использовать функцию обрезки для удаления лишних пробелов, например:

выражение:

EE.class  EE#id.class 

лексем:

EE.class 

    EE#id.class 

жетоны после отделки:

EE.class

EE # id.class

или, например,

> EE.class (оповещения, когда это прямой ребенок, то я отношусь с любым кодом подстроки)

Другие функции могут проверить, если лексема является числом, например,

Вы можете использовать http://regexpal.com/ для испытаний.

Смежные вопросы