Jak wyodrębnić ciąg za pomocą JavaScript Regex?

142

Próbuję wyodrębnić podciąg z pliku za pomocą JavaScript Regex. Oto wycinek z pliku:

DATE:20091201T220000
SUMMARY:Dad's birthday

pole, które chcę wyodrębnić, to „Podsumowanie”. Oto podejście:

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

Odpowiedzi:

93

Musisz użyć m flagi :

multiline; traktuj znaki początku i końca (^ i $) jako pracę nad wieloma wierszami (tj. dopasuj początek lub koniec każdego wiersza (oddzielone \ n lub \ r), a nie tylko sam początek lub koniec całego ciągu wejściowego)

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

"DATE:20091201T220000\r\nSUMMARY:Dad's birthday".match(/^SUMMARY\:(.*)$/gm);
//------------------------------------------------------------------^    ^
//-----------------------------------------------------------------------|
Salman A
źródło
104
function extractSummary(iCalContent) {
  var rx = /\nSUMMARY:(.*)\n/g;
  var arr = rx.exec(iCalContent);
  return arr[1]; 
}

Potrzebujesz tych zmian:

  • Umieść *wewnątrz nawiasów, jak sugerowano powyżej. W przeciwnym razie pasująca grupa będzie zawierała tylko jeden znak.

  • Pozbądź się ^i $. W przypadku opcji globalnej pasują one na początku i na końcu pełnego ciągu, a nie na początku i na końcu linii. Zamiast tego dopasuj do jawnych nowych linii.

  • Przypuszczam, że wolisz pasującą grupę (co jest w nawiasach) zamiast pełnej tablicy? arr[0]to pełne dopasowanie ( "\nSUMMARY:..."), a następne indeksy zawierają dopasowania grup.

  • String.match (regexp) ma zwrócić tablicę z dopasowaniami. W mojej przeglądarce tak nie jest (Safari na Macu zwraca tylko pełne dopasowanie, a nie grupy), ale działa Regexp.exec (string).

jg-faustus
źródło
1
Połączyłbym to z @barkmadley, || [null, null]ponieważ jeśli mecz się nie powiedzie, arrbyłby zerowy i rzuciłby arr[1]wyjątek
Kunal
22

Twoje wyrażenie regularne najprawdopodobniej chce

/\nSUMMARY:(.*)$/g

Pomocna sztuczka, której lubię używać, polega na domyślnym przypisywaniu przy dopasowaniu z tablicą.

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

W ten sposób nie dostaniesz irytujących błędów typu, gdy zaczniesz używać arr

barkmadley
źródło
3
matchzwraca wartość null, jeśli nie ma dopasowania
Kunal
7

(.*)zamiast (.)*to byłby początek. Ten ostatni przechwyci tylko ostatni znak w wierszu.

Nie ma też potrzeby ucieczki z :.

Tim Pietzcker
źródło
-1

w ten sposób możesz analizować pliki iCal za pomocą 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);
user187291
źródło