2009-11-10 23 views
74

może wyglądać oczywiste, ale ja zmarnowany zbyt dużo czasu, próbując zmusić go do pracy ...Jak wyodrębnić ciąg przy użyciu JavaScript Regex

Próbuję wyodrębnić podciąg z pliku z JavaScript Regex. Oto kawałek z pliku:

DATE:20091201T220000 
SUMMARY:Dad's birthday 

Pole, które chcę wyodrębnić, to Podsumowanie, więc próbuję napisać metodę, która zwraca tylko tekst podsumowania. Oto sposób:

extractSummary : function(iCalContent) { 
    /* 
    input : iCal file content 
    return : Event summary 
    */ 
    var arr = iCalContent.match(/^SUMMARY\:(.)*$/g); 
    return(arr); 
} 

jasno, jestem noobem regex :)) można to naprawić proszę? dzięki

Odpowiedz

55

Musisz użyć mflag:

multilinię; traktuj początkowe i końcowe znaki (^ i $) jako działające w wielu liniach (tj. dopasuj początek lub koniec każdej linii (rozdzielany przez \ n lub \ r), nie tylko sam początek lub koniec całego wejścia ciąg)

umieścić również * we właściwym miejscu:

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

(.*) zamiast (.)* będzie start. Ten ostatni przechwyci tylko ostatni znak na linii.

Również, nie trzeba uciec z :.

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

Trzeba te zmiany:

  • Umieść * wewnątrz nawiasu jako zasugerowano powyżej. W przeciwnym razie Twoja pasująca grupa będzie zawierała tylko jedną postać: .

  • Pozbyć się ^ i $. Z opcją globalną dopasowują się na początku i końcu całego łańcucha, a nie na początku i końcu linii. Zamiast tego dopasuj do jawnie nowych linii.

  • Przypuszczam, że chcesz dopasować grupę (co jest w nawiasie) zamiast pełną tablicę? arr[0] jest pełny mecz ("\nSUMMARY:...") i następne indeksy zawierają dopasowania grupy .

  • String.match (regexp) to ma zwrócić tablicę z dopasowaniami . W mojej przeglądarce nie działa (Safari na Mac zwraca tylko pełny mecz , a nie grupy), ale działa Regexp.exec (ciąg znaków).

+0

próbowałem ale doen'st praca. – PapelPincel

+1

Połączyłbym to z @barkmadley '|| [null, null] 'ponieważ jeśli mecz się nie powiedzie,' arr' będzie null i 'arr [1]' wyrzuci wyjątek – Kunal

11

Wyrażenie regularne najprawdopodobniej chce być

/\nSUMMARY:(.*)$/g 

Pomocny mały trick Lubię używać jest domyślne przypisanie na meczu z tablicy.

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

ten sposób, że nie pojawiają się błędy typu irytujące, gdy idziesz do korzystania arr

+1

'match' zwraca wartość null, jeśli nie ma _match_ – Kunal

-2

ten sposób można analizować pliki iCal z 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); 
Powiązane problemy