วิธีแยกสตริงโดยใช้ JavaScript Regex


133

ฉันพยายามแยกสตริงย่อยจากไฟล์ด้วย JavaScript 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);
}

คำตอบ:


88

คุณต้องใช้m ธง :

หลาย; ถือว่าอักขระเริ่มต้นและสิ้นสุด (^ และ $) เป็นการทำงานในหลายบรรทัด (เช่นจับคู่จุดเริ่มต้นหรือจุดสิ้นสุดของแต่ละบรรทัด (คั่นด้วย \ n หรือ \ r) ไม่ใช่เฉพาะจุดเริ่มต้นหรือจุดสิ้นสุดของสตริงอินพุตทั้งหมด)

วาง*ในตำแหน่งที่เหมาะสม:

"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]; 
}

คุณต้องการการเปลี่ยนแปลงเหล่านี้:

  • ใส่*ในวงเล็บตามที่แนะนำข้างต้น มิฉะนั้นกลุ่มที่ตรงกันของคุณจะมีอักขระเพียงตัวเดียว

  • กำจัด^และ$. ด้วยตัวเลือกส่วนกลางจะจับคู่เมื่อเริ่มต้นและสิ้นสุดของสตริงเต็มแทนที่จะเริ่มต้นและสิ้นสุดบรรทัด จับคู่กับบรรทัดใหม่ที่ชัดเจนแทน

  • ฉันคิดว่าคุณต้องการกลุ่มที่ตรงกัน (มีอะไรอยู่ในวงเล็บ) แทนที่จะเป็นอาร์เรย์แบบเต็ม arr[0]คือการจับคู่แบบเต็ม ( "\nSUMMARY:...") และดัชนีถัดไปประกอบด้วยกลุ่มที่ตรงกัน

  • String.match (regexp) ควรส่งคืนอาร์เรย์ด้วยการจับคู่ ในเบราว์เซอร์ของฉันไม่ได้ (Safari บน Mac ส่งคืนเฉพาะการจับคู่แบบเต็มเท่านั้นไม่ใช่กลุ่ม) แต่ Regexp.exec (สตริง) ใช้งานได้


1
ฉันจะรวมสิ่งนี้กับ @barkmadley || [null, null]เนื่องจากหากการแข่งขันล้มเหลวarrจะเป็นโมฆะและarr[1]จะมีข้อยกเว้น
Kunal

22

นิพจน์ทั่วไปของคุณน่าจะเป็น

/\nSUMMARY:(.*)$/g

เคล็ดลับเล็ก ๆ น้อย ๆ ที่เป็นประโยชน์ที่ฉันชอบใช้คือกำหนดค่าเริ่มต้นให้ตรงกับอาร์เรย์

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

วิธีนี้จะทำให้คุณไม่ได้รับข้อผิดพลาดประเภทที่น่ารำคาญเมื่อคุณไปใช้งาน arr


2
matchส่งคืนค่าว่างหากไม่มีการแข่งขัน
Kunal

7

(.*)แทนที่จะ(.)*เป็นการเริ่มต้น ตัวหลังจะจับเฉพาะอักขระสุดท้ายในบรรทัด

นอกจากนี้ไม่จำเป็นต้องหนีไฟล์:.


-1

นี่คือวิธีที่คุณสามารถแยกวิเคราะห์ไฟล์ 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.