JavaScript Regex kullanarak bir dize nasıl çıkarılır?


133

JavaScript Regex ile bir dosyadan bir alt dize çıkarmaya çalışıyorum. İşte dosyadan bir dilim:

DATE:20091201T220000
SUMMARY:Dad's birthday

Çıkarmak istediğim alan "Özet". İşte yaklaşım:

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

Yanıtlar:


88

m Bayrağı kullanmanız gerekir :

satırlı; başlangıç ​​ve bitiş karakterlerini (^ ve $) birden çok satır üzerinde çalışıyormuş gibi ele alın (yani, her satırın başlangıcını veya sonunu eşleştirin (\ n veya \ r ile sınırlandırılmış), yalnızca tüm girdi dizesinin en başını veya sonunu değil)

Ayrıca *doğru yere koyun :

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

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

Bu değişikliklere ihtiyacınız var:

  • *Yukarıda önerildiği gibi parantezin içini koyun . Aksi takdirde, eşleşen grubunuz yalnızca bir karakter içerecektir.

  • Kurtulun ^ve $. Global seçenekle, satırların başında ve sonunda değil, tam dizenin başında ve sonunda eşleşirler. Bunun yerine açık yeni satırlarla eşleştirin.

  • Sanırım tam dizi yerine eşleşen grubu (parantezin içinde ne var) istiyorsunuz? arr[0]tam eşleşmedir ( "\nSUMMARY:...") ve sonraki dizinler grup eşleşmelerini içerir.

  • String.match (regexp) 'nin eşleşmelerle bir dizi döndürmesi beklenir. Tarayıcımda görünmüyor (Mac'teki Safari grupları değil, yalnızca tam eşleşmeyi döndürüyor), ancak Regexp.exec (string) çalışıyor.


1
Bunu @barkmadley ile birleştirirdim || [null, null]çünkü maç başarısız olursa, arrgeçersiz olur ve arr[1]bir istisna atar
Kunal

22

Normal ifadeniz büyük olasılıkla

/\nSUMMARY:(.*)$/g

Kullanmaktan hoşlandığım yararlı bir küçük numara, bir dizi ile eşleşmeye varsayılan olarak atamaktır.

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

Bu şekilde kullanmaya gittiğinizde can sıkıcı tip hataları almazsınız. arr


2
matcheşleşme
Kunal

7

(.*)bunun yerine (.)*bir başlangıç ​​olurdu. İkincisi, yalnızca satırdaki son karakteri yakalayacaktır.

Ayrıca :,.


-1

iCal dosyalarını javascript ile bu şekilde ayrıştırabilirsiniz

    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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.