Как извлечь строку с помощью 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);