Як витягти рядок за допомогою 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 's, || [null, null]оскільки якщо матч не вдасться, arrбуло б недійсним і arr[1]викинув би виняток
Kunal

22

Ваш регулярний вираз, швидше за все, хоче бути

/\nSUMMARY:(.*)$/g

Корисний маленький трюк, який я люблю використовувати, - це присвоєння за замовчуванням у матчі з масивом.

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

Таким чином, ви не отримуєте дратівливих помилок типу, коли переходите до використання arr


2
matchповертає нуль, якщо не буде матчу
Kunal

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.