Причины использования хранимых процедур:
Вам необходимо использовать флаг m
:
multiline; обрабатывать начальные и конечные символы (^ и $) как рабочие на нескольких строках (т. е. сопоставить начало или конец каждой строки (разделенные \ n или \ r), а не только самое начало или конец вся входная строка)
Также поместите *
в нужное место:
"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------|
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 (строка) работает.
Скорее всего, ваше регулярное выражение должно быть
/\nSUMMARY:(.*)$/g
Небольшой полезный трюк, который мне нравится использовать, - назначать по умолчанию при сопоставлении с массивом.
var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];
Таким образом, вы не раздражаетесь ошибки типа при использовании arr
(. *)
вместо (.) *
будет началом. Последний захватит только последний символ в строке.
Кроме того, нет необходимости экранировать :
.
вот как вы можете анализировать файлы iCal с помощью 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);