Как извлечь строку с помощью JavaScript Regex? - PullRequest
107 голосов
/ 10 ноября 2009

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

Ответы [ 5 ]

87 голосов
/ 10 ноября 2009
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

Вам нужны эти изменения:

  • Поместите * в круглые скобки как предложено выше. В противном случае ваше соответствие группа будет содержать только один персонаж.

  • Избавьтесь от ^ и $. С помощью глобальной опции они соответствуют началу и концу полной строки, а не началу и концу строк. Вместо этого используйте явные символы новой строки.

  • Полагаю, вам нужна соответствующая группа (что внутри скобки), а не полный массив? arr[0] есть полное совпадение ("\nSUMMARY:...") и следующие индексы содержат группу спички.

  • String.match (регулярное выражение) должен вернуть массив с Матчи. В моем браузере это не так (Safari на Mac возвращает только полный матч, а не группы), но Regexp.exec (строка) работает.

74 голосов
/ 10 ноября 2009

Вам необходимо использовать флаг m :

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

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

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
16 голосов
/ 10 ноября 2009

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

/\nSUMMARY:(.*)$/g

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

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

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

6 голосов
/ 10 ноября 2009

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

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

0 голосов
/ 10 ноября 2009

это то, как вы можете анализировать файлы 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...