2012-08-10 13 views
9

Javascript ile bir kullanıcı giriş dizesini (saniye cinsinden) süre için ayrıştırmaya çalışıyorum.Javascript ile bir süre dizgesini saniyeler içinde nasıl ayrıştırabilirim?

  • "1 saat, 2 dakika"
  • "1 gün, 2 saat, 3 dakika"
  • : Burada

    ben başa edebilmek istiyorum bazı örnek girişler "1d 2h 37m"

  • "1 gün 2 dk"
  • "3gün 20 saat"

anahtar bileşenleri şunlardır: 1) gün, 2) saat 3) dakika, ancak bazı bileşenler her zaman dahil olmayabilir.

Benim saldırı planım .match ve regex kullanmaktır. Sözcüğün ilk harfini alabildiğim sürece, önceki sayıların ne olduğunu bileceğim ve sözcüklerin tüm farklı biçimlerini (örneğin saat, saat, saat, s) ele alabileceğim. Ancak, bunun için düzenli ifadeyi öğrendiğimden, düşündüğümden çok daha karmaşık olduğu ortaya çıktı.

Herhangi bir yardım veya öneri çok takdir edilecektir! açıkladığınız olarak

cevap

11

Dizinizde gün/saat/dakikaların sırası garanti edilir mi? Değilse, her biri için ayrı bir RegEx yapmak daha kolay olabilir. Böyle bir şey mi?

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; 
} 
bir birim dize izledi Bir dizi halinde dize kırmak için bu kodu kullanabilirsiniz
+0

Bu tam olarak aradığım şey. Attığım herşeyi hallediyor ve çok temiz. Teşekkürler bir ton! –

+0

, hiç bir eşleşme olmaması durumunda NaN’ı geri döndürmek için daha iyi olmaz mıydı, bilirsin, anlaşılmıyor mu? – Dan

1

herhangi bir kombinasyon maç için regex isteğe bağlı alt dizeleri kullanabilirsiniz: Bu, en az bir d, h gerektirir ve m ama ortak kısalmalara kabul

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

.

+0

D, h ve m'nin tümü mevcut olmasa bile çalışmak için ihtiyacı var gibi görünüyor. –

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); 
} 

Sonra işlev dizisi döndürür dizideki alternatif ürün değer gibi ["1","day","2","hours","3","minutes"] ve sonra bu değer için birim.

Yani, dize için:

"1 day, 2 hours, 3 minutes" 

işlevini verir:

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

Sonra sadece nasıl işleneceğine karar için her değer için birimler inceleyebilirsiniz.

Çalışma demoları ve test örnekleri burada: http://jsfiddle.net/jfriend00/kT9qn/. Fonksiyon, değişken miktarlardaki beyaz boşluklara toleranslıdır ve virgül, boşluk veya rakam ile birim etiketi arasında bir değişiklik yapmaz. Üniteden sonra bir boşluk veya bir virgül (en az bir) bekler.

+0

Çok güzeldi_______. – 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; 
}); 

Burada, dizeyi değiştirmek için değil, eşleştirmeleri tek tek işlemek için kullanın. Not günler, saatler herhangi bir sırada olabilir.

İlgili konular