Bagaimana cara mengekstraksi string menggunakan JavaScript Regex?

133

Saya mencoba mengekstraksi substring dari file dengan JavaScript Regex. Berikut adalah potongan dari file tersebut:

DATE:20091201T220000
SUMMARY:Dad's birthday

bidang yang ingin saya ekstrak adalah "Ringkasan". Inilah pendekatannya:

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

Jawaban:

88

Anda perlu menggunakan m bendera :

multiline; perlakukan karakter awal dan akhir (^ dan $) sebagai bekerja pada beberapa baris (yaitu, cocokkan dengan awal atau akhir setiap baris (dibatasi oleh \ n atau \ r), tidak hanya awal atau akhir dari seluruh string input)

Juga letakkan *di tempat yang tepat:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
Salman A
sumber
97
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

Anda perlu perubahan ini:

  • Letakkan bagian *dalam tanda kurung seperti yang disarankan di atas. Kalau tidak, grup yang cocok Anda hanya akan berisi satu karakter.

  • Singkirkan ^dan $. Dengan opsi global mereka cocok pada awal dan akhir string penuh, daripada pada awal dan akhir garis. Cocokkan dengan baris baru eksplisit sebagai gantinya.

  • Saya kira Anda ingin grup yang cocok (apa yang ada di dalam kurung) daripada array lengkap? arr[0]adalah pertandingan penuh ( "\nSUMMARY:...") dan indeks berikutnya berisi pertandingan kelompok.

  • String.match (regexp) seharusnya mengembalikan array dengan korek api. Di browser saya tidak (Safari pada Mac hanya mengembalikan kecocokan penuh, bukan grup), tetapi Regexp.exec (string) berfungsi.

jg-faustus
sumber
1
Saya akan menggabungkan ini dengan @barkmadley || [null, null]karena jika pertandingan gagal, arrakan menjadi nol dan arr[1]akan melempar pengecualian
Kunal
22

Ekspresi reguler yang paling Anda inginkan

/\nSUMMARY:(.*)$/g

Trik kecil yang membantu saya suka gunakan adalah untuk menetapkan default pada pertandingan dengan array.

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

Dengan cara ini Anda tidak mendapatkan kesalahan ketik yang mengganggu saat Anda pergi menggunakannya arr

barkmadley
sumber
2
matchmengembalikan nol jika tidak ada pertandingan
Kunal
7

(.*)bukannya (.)*akan menjadi awal. Yang terakhir hanya akan menangkap karakter terakhir di telepon.

Juga, tidak perlu melarikan diri :.

Tim Pietzcker
sumber
-1

ini adalah bagaimana Anda dapat mengurai file iCal dengan javascript

    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);
pengguna187291
sumber