2010-03-17 22 views
10

मैं स्काला 2.8 निम्न कोड के साथ (बीटा 1) में एक विकल्प के समूह पर मैच के लिए कोशिश कर रहा हूँ:स्काला: मिलान वैकल्पिक नियमित अभिव्यक्ति समूहों

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 

लेकिन यह काम नहीं कर रहा। वैकल्पिक regex समूहों से मेल खाने का सही तरीका क्या है?

उत्तर

17

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

import scala.xml._ 

val StatementPattern = """([\w\.]+)\s*:\s*([+-])?(\d+)""".r 

def buildProperty(input: String): Node = input match { 
    case StatementPattern(name, null, value) => <propertyWithoutSign /> 
    case StatementPattern(name, sign, value) => <propertyWithSign /> 
} 

val withSign = "property.name: +10" 
val withoutSign = "property.name: 10" 

buildProperty(withSign)  // <propertyWithSign></propertyWithSign> 
buildProperty(withoutSign)  // <propertyWithSign></propertyWithSign> 
+1

स्कैला Regex.unapplySeq में Matcher.group विधि का उपयोग करता है। यह निर्दिष्ट करता है कि यदि कोई समूह अनुक्रम के भाग से मेल नहीं खाता है, तो शून्य वापस आ गया है -

+2

यह अच्छा होगा अगर स्कैला एक वैकल्पिक रेगेक्स फ़ील्ड के लिए वैकल्पिक कक्षा के लिए विकल्प वर्ग का उपयोग कर सके, नल की जांच की आवश्यकता हो। –

0

मुझे आपके रेगेक्स के साथ कोई समस्या नहीं दिख रही है। हालांकि आपको चार वर्ग में . से बचने की आवश्यकता नहीं है।

संपादित करें: नाम और मान जहां मूल्य एक वैकल्पिक संकेत हो सकता है पर कब्जा करने के लिए

([\w.]+)\s*:\s*((?:+|-)?\d+) 

:

आप की तरह कुछ कोशिश कर सकते हैं।

+0

@codaddict धन्यवाद;) regex ठीक है, समस्या क्या मैं नहीं देख सकता कि स्काला पैटर्न मिलान प्रणाली का उपयोग करके वैकल्पिक समूह से कौन मिलान करना है। और मुझे नेट –

+0

@ कोडाडाडिक्ट धन्यवाद पर ऐसा करने के लिए कोई उदाहरण नहीं मिल रहा है, धन्यवाद, जो मेरा कोड काम करेगा, लेकिन स्कैला पैटर्न मिलान प्रश्न अभी भी बना हुआ है :) मुझे वास्तव में अलग-अलग एक्सएमएल की आवश्यकता है कि कोई संकेत है या नहीं , तो पैटर्न मिलान प्रणाली का उपयोग करके निकालने और परीक्षण करने के लिए यदि कोई संकेत है तो मुझे सबसे साफ समाधान की तरह लगता है –

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