Как извлечь строку с помощью регулярного выражения Javascript
это может выглядеть очевидным, но я потратил слишком много времени, пытаясь заставить его работать...
Я пытаюсь извлечь подстроку из файла с помощью 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);
}
ясно, что я Regex noob :)) не могли бы вы это исправить, пожалуйста ? спасибо
5 ответов:
вы должны использовать
m
флаг:многострочный; обрабатывать начальные и конечные символы (^и $) как рабочие по нескольким строкам (т. е. соответствует началу или концу каждой строки (разделяется \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]
is полный матч ("\nSUMMARY:..."
) и следующие индексы содержат группу спички.строку.матч (регулярное выражение) является должна возвращать массив с спички. В моем браузере это не так (Safari на Mac возвращает только полный матч, а не группы), но Регулярное выражение.метод 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);