2011-03-13 13 views
6

मैं कुछ स्ट्रिंग है, वे लगता है कि:रेगेक्स द्वारा इस स्ट्रिंग को कैसे विभाजित करें?

div#title.title.top 
#main.main 
a.bold#empty.red 

वे haml के समान हैं, और मैं उन्हें रेगुलर एक्सप्रेशन द्वारा विभाजित करना चाहते हैं, लेकिन मैं इसे कैसे परिभाषित करने के लिए पता नहीं है।

val r = """???""".r // HELP 
val items = "a.bold#empty.red".split(r) 
items // -> "a", ".bold", "#empty", ".red" 

यह कैसे करें?


अद्यतन

क्षमा करें, हर किसी को है, लेकिन मैं इस सवाल को कठिन बनाने की जरूरत है। मैं बहुत

val r = """(?<=\w)\b""" 

में दिलचस्पी रखता हूँ लेकिन यह अधिक जटिल पार्स करने में विफल:

div#question-title.title-1.h-222_333 

मुझे आशा है कि यह पार्स किया जाएगा करने के लिए:

div 
#question-title 
.title-1 
.h-222_333 

मुझे पता है कि करने के लिए करना चाहते हैं उस regex में सुधार?

+1

ठीक है, आपने इसका विश्लेषण करने के लिए _expect_ क्या किया? आपने वास्तव में समझाया नहीं है कि आपकी अपेक्षाएं क्या हैं। –

उत्तर

2

मैं पूरी तरह से सुनिश्चित करें कि आप यहाँ क्या जरूरत है नहीं कर रहा हूँ, लेकिन यह मदद करनी चाहिए:

(?:\.|#)?\w+ 

यह एक "शब्द" एक वैकल्पिक डॉट या हैश कुछ शब्द पात्रों द्वारा पीछा के रूप में परिभाषित किया गया है इसका मतलब है।

आप के साथ खत्म हो जाएगा:

div 
#title 
.title 
.top 
#main 
.main 
a 
.bold 
#empty 
.red 
8
val r = """(?<=\w)\b(?!-)""" 

ध्यान दें कि विभाजन, एक String एक रेगुलर एक्सप्रेशन, नहीं एक Regex का प्रतिनिधित्व लेता है ताकि आप String से r परिवर्तित नहीं होना चाहिए Regex करने के लिए।

regex पर संक्षिप्त विवरण:

  • (?<=...) एक नज़र-पीछे है। यह बताता है कि यह मैच पैटर्न ..., या आपके मामले में \w से पहले होना चाहिए, जिसका अर्थ है कि आप पैटर्न को अंक, अक्षर या अंडरलाइन का पालन करना चाहते हैं।

  • \b शब्द सीमा का मतलब है। यह एक शून्य-लंबाई का मिलान होता है जो एक शब्द वर्ण (अंक, अक्षरों और अंडरस्कोर) और एक गैर-शब्द चरित्र, या इसके विपरीत होता है। क्योंकि यह शून्य-लंबाई है, split विभाजन करते समय किसी भी वर्ण को नहीं हटाएगा।

  • (?!...) एक नकारात्मक-लुकहेड है। यहां मैं यह कहने के लिए उपयोग करता हूं कि मुझे एक पत्र से शब्द सीमाओं में डैश में दिलचस्पी नहीं है।

3

जोश एम के जवाब के साथ शुरू, वह एक अच्छे रेगुलर एक्सप्रेशन है, लेकिन split एक नियमित रूप से "सीमांकक" मिलान, आप इस प्रकार findAllIn उपयोग करने की आवश्यकता अभिव्यक्ति लेता है के बाद से:

val r = """(?:\.|#)?\w+""".r 
val items = r findAllIn "a.bold#empty.red" 
    //maybe you want a toList on the end also 

तो फिर तुम परिणाम

div#title.title.top -> List(div, #title, .title, .top) 
#main.main    -> List(#main, .main) 
a.bold#empty.red  -> List(a, .bold, #empty, .red) 
+0

हाँ, मुझे प्रश्न में फ़ंक्शन के विनिर्देशों को नहीं पता था। –

+0

आपको बहुत बहुत धन्यवाद। लेकिन चूंकि @ जोश पहला व्यक्ति है जो मुझे सही उत्तर देता है, इसलिए मैं उसका जवाब स्वीकार करने का फैसला करता हूं। – Freewind

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

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