2009-11-10 11 views
74

का उपयोग कर यह स्पष्ट लग सकता है एक स्ट्रिंग को निकालने के लिए, लेकिन मैंकैसे जावास्क्रिप्ट Regex

मैं जावास्क्रिप्ट Regex के साथ एक फ़ाइल से सबस्ट्रिंग निकालने के लिए कोशिश कर रहा हूँ ... यह काम करने के लिए प्राप्त करने की कोशिश भी अधिक समय बर्बाद किया। यहाँ फ़ाइल से एक टुकड़ा है:

DATE:20091201T220000 
SUMMARY:Dad's birthday 

क्षेत्र मैं निकालना चाहते हैं सारांश है, इसलिए मैं एक विधि है कि केवल सारांश पाठ रिटर्न लिखने की कोशिश कर रहा हूँ। यहां विधि है:

extractSummary : function(iCalContent) { 
    /* 
    input : iCal file content 
    return : Event summary 
    */ 
    var arr = iCalContent.match(/^SUMMARY\:(.)*$/g); 
    return(arr); 
} 

स्पष्ट रूप से, मैं रेगेक्स नोब हूं :)) क्या आप इसे ठीक कर सकते हैं? धन्यवाद

उत्तर

55

आप m उपयोग करने की आवश्यकता flag:

मल्टीलाइन; कई पंक्तियों पर काम करने के रूप में शुरुआत और अंत वर्ण (^ और $) का इलाज करें (यानी, प्रत्येक पंक्ति (\ n या \ r द्वारा सीमित) की शुरुआत या अंत से मेल खाता है, न केवल संपूर्ण इनपुट की शुरुआत या अंत स्ट्रिंग)

इसके अलावा सही जगह में * डाल:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm); 
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------| 
6

(.*)(.)* की बजाय शुरुआत होगी। उत्तरार्द्ध केवल लाइन पर अंतिम चरित्र को पकड़ लेगा।

इसके अलावा, : से बचने की कोई आवश्यकता नहीं है।

64
function extractSummary(iCalContent) { 
    var rx = /\nSUMMARY:(.*)\n/g; 
    var arr = rx.exec(iCalContent); 
    return arr[1]; 
} 

आप इन परिवर्तनों को जरूरत है:

  • कोष्टक अंदर * रखो के रूप में ऊपर का सुझाव दिया। अन्यथा आपके मिलान समूह में केवल एक वर्ण होगा।

  • ^ और $ से छुटकारा पाएं। वैश्विक विकल्प के साथ वे लाइनों की शुरुआत और अंत के बजाय पूर्ण स्ट्रिंग के प्रारंभ और अंत पर मेल खाते हैं। इसके बजाय स्पष्ट न्यूलाइन पर मिलान करें।

  • मुझे लगता है कि आप मिलान करने वाले समूह ( को ब्रांड्स के अंदर क्या चाहते हैं) पूर्ण सरणी के बजाय? arr[0] पूर्ण मिलान ("\nSUMMARY:...") और अगली अनुक्रमणिका में समूह मैचों में समूह शामिल है।

  • स्ट्रिंग.मैच (regexp) मैचों के साथ एक सरणी वापस करने वाला माना जाता है। मेरे ब्राउज़र में यह नहीं है (मैक पर सफारी केवल पूर्ण मैच लौटाता है, समूह नहीं), लेकिन Regexp.exec (स्ट्रिंग) काम करता है।

+0

यह कोशिश की, लेकिन doen'st काम करते हैं। – PapelPincel

+1

मैं इसे @barkmadley के साथ जोड़ दूंगा || [शून्य, शून्य] 'चूंकि मैच विफल रहता है,' एआर 'शून्य होगा और' arr [1] 'अपवाद फेंक देगा – Kunal

11

आपका रेगुलर एक्सप्रेशन सबसे अधिक संभावना होने के लिए

/\nSUMMARY:(.*)$/g 

एक उपयोगी छोटे चाल मैं का उपयोग करना चाहते डिफ़ॉल्ट एक सरणी के साथ मैच पर आवंटित है चाहता है।

var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value 
return arr[0]; 

इस तरह से जब आप arr

+1

' मिलान 'कोई शून्य नहीं देता है अगर कोई _match_ नहीं है – Kunal

-2

उपयोग करने के लिए कि यह कैसे आप जावास्क्रिप्ट के साथ iCal फ़ाइलें पार्स कर सकते है जाना आप कष्टप्रद प्रकार त्रुटियों नहीं मिलता है

function calParse(str) { 

     function parse() { 
      var obj = {}; 
      while(str.length) { 
       var p = str.shift().split(":"); 
       var k = p.shift(), p = p.join(); 
       switch(k) { 
        case "BEGIN": 
         obj[p] = parse(); 
         break; 
        case "END": 
         return obj; 
        default: 
         obj[k] = p; 
       } 
      } 
      return obj; 
     } 
     str = str.replace(/\n /g, " ").split("\n"); 
     return parse().VCALENDAR; 
    } 

    example = 
    'BEGIN:VCALENDAR\n'+ 
    'VERSION:2.0\n'+ 
    'PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n'+ 
    'BEGIN:VEVENT\n'+ 
    'DTSTART:19970714T170000Z\n'+ 
    'DTEND:19970715T035959Z\n'+ 
    'SUMMARY:Bastille Day Party\n'+ 
    'END:VEVENT\n'+ 
    'END:VCALENDAR\n' 


    cal = calParse(example); 
    alert(cal.VEVENT.SUMMARY); 
संबंधित मुद्दे