2015-12-07 2 views
5

Я хотел бы вытащить последний класс из правил css, используя Regex в javascript.Regex, чтобы получить последний класс css

Правило регулярного выражения, которое я собираюсь, это начать поиск с конца правила, например. на «.MyClass .myOtherClass' и вернуть первое слово после последней полной остановки - так что результат там будет

правила Пример CSS» .myOtherClass' Мне нужно соответствовать на:

.myClass{color:red;} 
.myClass .myOtherClass{color:green;} 
#something .somethingElse{color:blue;} 
.something #myIdhere{color:purple;} 
#myId {color:black} 
.myClass1, .myClass2{colour:green} 
.myClass span{colour:purple} 
.myPseudo:after{} 

Я могу получить правила самостоятельно без {} info. Поэтому его регулярное выражение будет запускать каждый из правил самостоятельно. например on '.myClass .myOtherClass' самостоятельно. Вывод из правил выше, которые я хотел бы получить, состоит в том, что он соответствует следующим образом:

.myClass 
.myOtherClass 
.somethingElse 
.something 
no match 
.myClass2 
.myClass 
.myPseudo 

Может кто-нибудь помочь?

+2

Пожалуйста, поделитесь, что у ou уже есть? – giorgio

+0

У меня действительно только это, чтобы получить правила из tbh, например. string.replace (/ [A-Za-z0-9. # -_] * \ {/, '') .replace (/ \} /, '') .trim(); После этого я нашел несколько сообщений, начиная с конца строки, например. http://stackoverflow.com/questions/2552428/regex-use-start-of-line-end-of-line-signs-or-in-different-context Но я не уверен, как это сделать с символьным совпадением. Мой рег-ex довольно ужасный tbh! –

+0

Какова конечная причина, по которой вы пытаетесь это сделать? –

ответ

1
.*(\.[a-zA-Z0-9]*) 

Получение первой группы дает вам то, что вы хотите для всех своих тестовых случаев.

Это работает благодаря жадности .*, которая будет соответствовать как можно больше, оставив последний класс в соответствии с остальной частью рисунка.

Try it here

+0

brill, огромное спасибо! –

+1

это не соответствует '.menu_tab' .. и совсем некоторые другие вещи тоже не будут работать – CoderPi

+0

@CodeiSir true.Считаете ли вы, что '\ w' отлично подходит для персонажей, которые могут составить имя класса? – Aaron

0

Является ли это то, что вы хотите?

var str = 'your css'; 
var hits = str.match(/\.\w+/gm); 
var css = hits.pop(); //hits[hits.length-1]; 
+0

Сомнительно, потому что он будет терпеть неудачу при именах классов, включая дефисы. –

1

Это RegEx будет работать для всех действительных CSS-класс-имен: (Demo here)

(\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*) 

Вот JavaScript, чтобы получить все CSS-класс-имена, а также последний: (Demo here)

var css = '' 
var classNames = css.match(/(\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*)/g) 
var lastClass = classNames[classNames.length - 1] 

Регулярное выражение частично взято из: https://stackoverflow.com/a/449000/4339170

+0

Обратите внимание, что он будет соответствовать классам в комментариях: '/ * .commentedOut {} * /'. Также это может не потребоваться, возможно, мы сможем найти решение для этого. – CoderPi

+0

Собственно, это ** не будет ** совпадать, потому что 'a \: b' действителен. Или класс может быть CSS-namespaced с '!'. Просто показывается, что вы не должны анализировать CSS (или большинство других языков) с помощью регулярного выражения. Использовать синтаксический анализатор; вот почему они существуют. –

+0

Согласно http://www.w3.org/TR/CSS21/grammar.html#scanner и идентификатор в CSS - это '-? {Nmstart} {nmchar} *' именно это было запрошено и предоставлено. Потому что есть целая куча других вещей, если вы проверите ссылку! Но это не цель этого вопроса! – CoderPi