Как извлечь строку с помощью JavaScript Regex?

133

Я пытаюсь извлечь подстроку из файла с помощью 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);
}
PapelPincel
источник

Ответы:

88

Вам нужно использовать m флаг :

многострочный; обрабатывать начальные и конечные символы (^ и $) как работу над несколькими строками (т. е. соответствовать началу или концу каждой строки (разделенным \ n или \ r), а не только самому началу или концу всей входной строки)

Также поместите *в нужное место:

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
Салман А
источник
97
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 (строка) работает.

JG-Фауст
источник
1
Я бы скомбинировал это с @barkmadley, || [null, null]так как, если совпадение не удастся, arrбудет null и arr[1]будет выдано исключение
Кунал
22

Ваше регулярное выражение, скорее всего, должно быть

/\nSUMMARY:(.*)$/g

Мне нравится использовать небольшой полезный трюк - назначать по умолчанию при сопоставлении с массивом.

var arr = iCalContent.match(/\nSUMMARY:(.*)$/g) || [""]; //could also use null for empty value
return arr[0];

Таким образом, вы не получите досадных ошибок типа при использовании arr

barkmadley
источник
2
matchвозвращает ноль, если совпадений
Кунал
7

(.*)вместо того, (.)*чтобы начать. Последний захватит только последний символ в строке.

Кроме того, нет необходимости избегать :.

Тим Питцкер
источник
-1

вот как вы можете анализировать файлы 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);
user187291
источник