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

Ответы:


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 (строка) работает.


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


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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.