Как извлечь строку с помощью регулярного выражения 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 88

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);