Làm cách nào để trích xuất một chuỗi bằng JavaScript Regex?


133

Tôi đang cố trích xuất một chuỗi con từ một tệp bằng JavaScript Regex. Đây là một lát từ tệp:

DATE:20091201T220000
SUMMARY:Dad's birthday

lĩnh vực tôi muốn trích xuất là "Tóm tắt". Đây là cách tiếp cận:

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

Câu trả lời:


88

Bạn cần sử dụng m cờ :

đa dòng; coi các ký tự đầu và cuối (^ và $) là hoạt động trên nhiều dòng (nghĩa là khớp với đầu hoặc cuối của mỗi dòng (được phân định bởi \ n hoặc \ r), không chỉ đầu hoặc cuối của toàn bộ chuỗi đầu vào)

Cũng đặt *đúng chỗ:

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

Bạn cần những thay đổi sau:

  • Đặt *bên trong dấu ngoặc đơn như đề xuất ở trên. Nếu không, nhóm phù hợp của bạn sẽ chỉ chứa một ký tự.

  • Loại bỏ ^$. Với tùy chọn toàn cầu, chúng khớp với nhau ở đầu và cuối của chuỗi đầy đủ, thay vì ở đầu và cuối dòng. Thay vào đó, phù hợp với các dòng mới rõ ràng.

  • Tôi cho rằng bạn muốn nhóm phù hợp (những gì bên trong dấu ngoặc đơn) chứ không phải là mảng đầy đủ? arr[0]là kết quả khớp hoàn toàn ( "\nSUMMARY:...") và các chỉ mục tiếp theo chứa các kết quả khớp nhóm.

  • String.match (regrec) được cho là trả về một mảng với các kết quả khớp. Trong trình duyệt của tôi, nó không (Safari trên Mac chỉ trả về kết quả khớp hoàn toàn, không phải các nhóm), nhưng Regapi.exec (chuỗi) hoạt động.


1
Tôi sẽ kết hợp điều này với @barkmadley || [null, null]vì nếu trận đấu thất bại, arrsẽ vô hiệu và arr[1]sẽ ném một ngoại lệ
Kunal

22

Biểu hiện thường xuyên của bạn rất có thể muốn trở thành

/\nSUMMARY:(.*)$/g

Một mẹo nhỏ hữu ích tôi muốn sử dụng là gán mặc định khớp với một mảng.

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

Bằng cách này, bạn không gặp phải lỗi loại gây phiền nhiễu khi bạn sử dụng arr


2
matchtrả về null nếu không có kết quả khớp
Kunal

7

(.*)thay vì (.)*sẽ là một khởi đầu. Cái sau sẽ chỉ bắt nhân vật cuối cùng trên dòng.

Ngoài ra, không cần phải thoát khỏi :.


-1

đây là cách bạn có thể phân tích các tệp iCal bằng 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.