2009-11-10 3 views
74

это может выглядеть очевидным, но я потратил слишком много времени, пытаясь заставить его работать ...Как извлечь строку с помощью Javascript Regex

Я пытаюсь извлечь подстроку из файла с 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 :)) Не могли бы вы исправить это, пожалуйста? спасибо

ответ

55

Вы должны использовать mflag

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

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

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm); 
//------------------------------------------------------------------^ ^
//-----------------------------------------------------------------------| 
6

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

Также не нужно избегать :.

64
function extractSummary(iCalContent) { 
    var rx = /\nSUMMARY:(.*)\n/g; 
    var arr = rx.exec(iCalContent); 
    return arr[1]; 
} 

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

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

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

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

  • String.match (regexp) is Предполагается вернуть массив с совпадением . В моем браузере это не так (Safari on Mac возвращает только полное совпадение , а не группы), но Работает Regexp.exec (строка).

+0

пробовал, но doen'st работа. – PapelPincel

+1

Я бы объединил это с @barkmadley '|| [null, null] ', поскольку если совпадение не будет выполнено,' arr' будет null и 'arr [1]' будет вызывать исключение – Kunal

11

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

/\nSUMMARY:(.*)$/g 

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

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

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

+1

'match' возвращает null, если нет _match_ – Kunal

-2

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