2012-08-10 8 views
9

मैं जावास्क्रिप्ट के साथ अवधि (सेकेंड में) के लिए उपयोगकर्ता इनपुट स्ट्रिंग को पार्स करने का प्रयास कर रहा हूं।जावास्क्रिप्ट के साथ सेकंड में अवधि स्ट्रिंग को कैसे पार्स करें?

  • "1 घंटा, 2 मिनट"
  • "1 दिन, 2 घंटे, 3 मिनट"
  • :

    यहां कुछ उदाहरण आदानों है कि मैं से निपटने के लिए सक्षम होने के लिए करना चाहते हैं "1 दिन 2h 37m"

  • "1 दिन 2 मिनट"
  • "3days 20hours"

प्रमुख घटक 1 हैं) दिन, 2) घंटे 3) मिनट, लेकिन कुछ घटकों को हमेशा शामिल नहीं किया जा सकता है।

हमले की मेरी योजना का उपयोग करना है। मैच और रेगेक्स। जब तक मैं शब्द का पहला अक्षर प्राप्त कर सकता हूं, मुझे पता चलेगा कि पिछले संख्या क्या है और शब्दों के सभी अलग-अलग प्रारूपों को संभालने में सक्षम हो (जैसे घंटे, घंटा, घंटा, एच)। हालांकि, चूंकि मैं इसके लिए रेगेक्स सीख रहा हूं, इसलिए मैंने सोचा जितना जटिल हो गया है।

किसी भी मदद या सुझाव की सराहना की जाएगी!

उत्तर

11

क्या आपकी स्ट्रिंग में दिन/घंटे/मिनट का ऑर्डर दिया गया है? यदि नहीं, तो प्रत्येक के लिए एक अलग RegEx करना आसान हो सकता है। कुछ इस तरह?

function getSeconds(str) { 
    var seconds = 0; 
    var days = str.match(/(\d+)\s*d/); 
    var hours = str.match(/(\d+)\s*h/); 
    var minutes = str.match(/(\d+)\s*m/); 
    if (days) { seconds += parseInt(days[1])*86400; } 
    if (hours) { seconds += parseInt(hours[1])*3600; } 
    if (minutes) { seconds += parseInt(minutes[1])*60; } 
    return seconds; 
} 
+0

यह वही है जो मैं ढूंढ रहा था। मैं जो कुछ भी फेंकता हूं उसे संभालता है और बहुत साफ है। अनेक अनेक धन्यवाद! –

+0

नाइन वापस लौटने के लिए बेहतर नहीं होगा यदि कोई मैच नहीं था, तो आप जानते हैं कि असंगत होना है? – Dan

1

आप के रूप में आप का वर्णन किसी भी संयोजन से मेल करने के लिए regex में वैकल्पिक सबस्ट्रिंग का उपयोग कर सकते हैं:

/(\d+)\s*d(ays?)?\s*(\d+)\s*h(ours?)?\s*(\d+)\s*m(in(utes?)?)?/ 

यह कम से कम एक d, hm आवश्यकता है, और लेकिन आम shortenings स्वीकार करता है।

+0

ऐसा लगता है कि उसे काम करने की आवश्यकता है भले ही डी, एच, और एम मौजूद नहीं हैं। –

2

आप एक संख्या में अपने स्ट्रिंग को तोड़ने के लिए इस कोड का उपयोग कर सकते हैं, एक इकाई स्ट्रिंग हो:

function getPieces(str) { 
    var pieces = []; 
    var re = /(\d+)[\s,]*([a-zA-Z]+)/g, matches; 
    while (matches = re.exec(str)) { 
     pieces.push(+matches[1]); 
     pieces.push(matches[2]); 
    } 
    return(pieces); 
} 

तब समारोह एक सरणी देता है जैसे ["1","day","2","hours","3","minutes"] जहां सरणी में बारी आइटम मान रहे हैं और फिर उस मूल्य के लिए इकाई।

तो, स्ट्रिंग के लिए:

"1 day, 2 hours, 3 minutes" 

समारोह रिटर्न:

[1, "day", 2, "hours", 3, "minutes"] 

उसके बाद, आप बस इसे कैसे संभाल करने के लिए तय करने के लिए प्रत्येक मान के लिए इकाइयों की जांच कर सकते हैं।

वर्किंग डेमो और टेस्ट केस यहां: http://jsfiddle.net/jfriend00/kT9qn/। समारोह सफेद जगह की परिवर्तनीय मात्रा का सहिष्णु है और एक अल्पविराम, एक स्थान या न तो अंक और इकाई लेबल के बीच ले जाएगा। यह इकाई के बाद या तो अंतरिक्ष या अल्पविराम (कम से कम एक) की अपेक्षा करता है।

+0

बहुत अच्छा_______। – some

1
var str = "1 day, 2 hours, 3 minutes"; 

var seconds = 0; 
str.replace (/\s*,?(\d+)\s*(?:(d)(?:ays?)?|(h)(?:ours?)?|(m)(?:in(?:utes?)?)?)/g, function (m0, n, d, h, m) { 
    seconds += +n * (d ? 24 * 60 * 60 : h ? 60 * 60 : 60); 
    return m0; 
}); 

यहां मैं स्ट्रिंग को बदलने के लिए नहीं बल्कि मैचों को एक-एक करके संसाधित करने के लिए प्रतिस्थापित करता हूं। दिन नोट करें, किसी भी क्रम में घंटे के मिनट हो सकते हैं।

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