Как извлечь строку с помощью Javascript Regex
это может показаться очевидным, но я потратил слишком много времени, пытаясь заставить его работать...
Я пытаюсь извлечь подстроку из файла с помощью Javascript Regex. Вот фрагмент из файла:
DATE:20091201T220000
SUMMARY:Dad birthday
поле, которое я хочу извлечь, - это Summary, поэтому я пытаюсь написать метод, который возвращает только итоговый текст. Вот способ:
extractSummary : function(iCalContent) {
/*
input : iCal file content
return : Event summary
*/
var arr = iCalContent.match(/^SUMMARY\:(.)*$/g);
return(arr);
}
ясно, я Regex noob:)) Не могли бы вы исправить это, пожалуйста? спасибо
Ответы
Ответ 1
Вам нужно использовать флаг m
:
многострочный; обрабатывать начальные и конечные символы (^ и $) как рабочие по нескольким строкам (т.е. соответствуют началу или концу каждой строки (ограничено\n или \r), а не только начало или конец целая строка ввода)
Также поместите *
в нужное место:
"DATE:20091201T220000\r\nSUMMARY:Dad birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------|
Ответ 2
function extractSummary(iCalContent) {
var rx = /\nSUMMARY:(.*)\n/g;
var arr = rx.exec(iCalContent);
return arr[1];
}
Вам нужны следующие изменения:
-
Поместите *
в круглую скобку как
предложенных выше. В противном случае
группа будет содержать только одну
персонаж.
-
Избавьтесь от ^
и $
. С глобальным вариантом они соответствуют началу и концу полной строки, а не по началу и концу строк. Вместо этого сопоставьтесь с явными символами новой строки.
-
Я предполагаю, что вам нужна соответствующая группа (что
внутри скобок), а не
полный массив? arr[0]
полный матч ("\nSUMMARY:..."
) и
следующие индексы содержат группу
спички.
-
String.match(regexp) является
должен возвращать массив с
Матчи. В моем браузере это не так (Safari on Mac возвращает только полный
а не группы), но
Regexp.exec(строка) работает.
Ответ 3
Ваше регулярное выражение, скорее всего, хочет быть
/\nSUMMARY:(.*)$/g
Полезный небольшой трюк, который мне нравится использовать, - назначить по умолчанию для соответствия с массивом.
var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];
Таким образом, при использовании arr
вы не получите раздражающих ошибок типа,
Ответ 4
(.*)
вместо (.)*
будет началом. Последний будет захватывать только последний символ на линии.
Кроме того, не нужно скрывать :
.
Ответ 5
Вот как вы можете разбирать файлы 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);