2015-12-07 8 views
5

प्राप्त करने के लिए रेगेक्स मैं जावास्क्रिप्ट में रेगेक्स का उपयोग कर सीएसएस नियमों से अंतिम कक्षा को खींचना चाहता हूं।अंतिम सीएसएस कक्षा

रेगेक्स नियम जो मैं जा रहा हूं वह नियम के अंत से खोजना शुरू करना है। '.myClass .myOtherClass' पर और पिछली पूर्ण विराम के बाद पहला शब्द लाने के लिए - तो परिणाम होगा '.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{} 

मैं {} जानकारी के बिना नियम स्वयं प्राप्त कर सकता हूं। तो यह रेगेक्स अपने नियमों में से प्रत्येक को चलाएगा। जैसे '.myClass .myOtherClass' पर अपने आप पर। उपरोक्त नियमों से आउटपुट यह है कि मैं यह प्राप्त करना चाहता हूं कि यह नीचे जैसा है:

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

क्या कोई मदद कर सकता है?

+2

क्या साझा करें y कहां पहले से है? – giorgio

+0

मैं वास्तव में केवल tbh जैसे नियम प्राप्त करने के लिए इसे प्राप्त करता हूं उदा। string.replace (/ [ए-ज़ा-जे 0-9। # -_] * \ {/, '')। स्थान (/ \} /, '') .trim(); उसके बाद मुझे स्ट्रिंग के अंत से शुरू होने पर कुछ पोस्ट मिल गई हैं उदा। http://stackoverflow.com/questions/2552428/regex-use-start-of-line-end-of-line-signs-or-in- अलग-context लेकिन मुझे वास्तव में यह सुनिश्चित नहीं है कि इसे एक साथ कैसे खींचें एक चरित्र मैच के साथ। मेरा reg-ex बहुत भयानक tbh है! –

+0

आप ऐसा करने का प्रयास कर रहे अंतिम कारण क्या हैं? –

उत्तर

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

पहले समूह को पुनर्प्राप्त करने से आप अपने सभी परीक्षण मामलों के लिए क्या चाहते हैं।

यह .* की लालची के लिए धन्यवाद करता है जो जितना संभव हो सके मिलान करेगा, अंतिम वर्ग को शेष पैटर्न से मिलान करने के लिए छोड़ देगा।

Try it here

+0

ब्रिल, बहुत बहुत धन्यवाद! –

+1

यह '.menu_tab' से मेल नहीं खाता .. और कुछ अन्य सामान भी काम नहीं करेंगे – CoderPi

+0

@CodeiSir सच।क्या आपको लगता है कि '\ w' उन पात्रों के लिए एक अच्छा फिट होगा जो कक्षा का नाम बना सकते हैं? – Aaron

0

आप यही चाहते है?

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

संदिग्ध, क्योंकि यह हाइफ़न सहित कक्षा के नामों में विफल हो जाएगा। –

1

यह रेगुलर एक्सप्रेशन से सभी वैध सीएसएस-क्लास-नाम के लिए काम करेंगे: (Demo here)

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

यहाँ सब सीएसएस-वर्ग-नाम और भी पिछले एक पाने के लिए जावास्क्रिप्ट है: (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' मान्य है। या, वर्ग '!' के साथ सीएसएस-नामित हो सकता है। बस यह दिखाने के लिए चला जाता है कि आपको regexp के साथ सीएसएस (या अधिकतर अन्य भाषाओं) का विश्लेषण नहीं करना चाहिए। एक पार्सर का प्रयोग करें; यही कारण है कि वे मौजूद हैं। –

+0

http://www.w3.org/TR/CSS21/grammar.html#scanner और सीएसएस में पहचानकर्ता के अनुसार '-? {Nmstart} {nmchar} *' वही है जो अनुरोध किया गया था और प्रदान किया गया था। यदि आप लिंक की जांच करते हैं तो कारण अन्य सामानों का एक पूरा समूह है! लेकिन यह इस सवाल का उद्देश्य नहीं है! – CoderPi

संबंधित मुद्दे