Como extrair uma string usando JavaScript Regex?

133

Estou tentando extrair uma substring de um arquivo com JavaScript Regex. Aqui está uma fatia do arquivo:

DATE:20091201T220000
SUMMARY:Dad's birthday

o campo que quero extrair é "Resumo". Aqui está a abordagem:

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

Respostas:

88

Você precisa usar a m bandeira :

multilinha; trate os caracteres inicial e final (^ e $) como trabalhando em várias linhas (ou seja, corresponda ao início ou final de cada linha (delimitado por \ n ou \ r), não apenas o início ou o fim de toda a cadeia de entrada)

Coloque também *o local certo:

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

Você precisa destas alterações:

  • Coloque o *interior dos parênteses, como sugerido acima. Caso contrário, seu grupo correspondente conterá apenas um caractere.

  • Livre-se do ^e $. Com a opção global, eles correspondem no início e no final da sequência completa, em vez de no início e no final das linhas. Combine com novas linhas explícitas

  • Suponho que você queira o grupo correspondente (o que está entre parênteses) em vez de toda a matriz? arr[0]é a correspondência completa ( "\nSUMMARY:...") e os próximos índices contêm as correspondências do grupo.

  • String.match (regexp) deve retornar uma matriz com as correspondências. No meu navegador, isso não ocorre (o Safari no Mac retorna apenas a correspondência completa, não os grupos), mas o Regexp.exec (string) funciona.

jg-faustus
fonte
1
Eu combinaria isso com o de @barkmadley, || [null, null]pois, se a partida falhasse , arrseria nula e arr[1]geraria uma exceção #
Kunal Kunal
22

Sua expressão regular provavelmente quer ser

/\nSUMMARY:(.*)$/g

Um pequeno truque útil que eu gosto de usar é atribuir por padrão a correspondência com uma matriz.

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

Dessa forma, você não recebe erros de tipo irritantes ao usar arr

Barkmadley
fonte
2
matchretorna um nulo se não houver correspondência
Kunal 5/05
7

(.*)em vez de (.)*seria um começo. Este último capturará apenas o último caractere na linha.

Além disso, não há necessidade de escapar do :.

Tim Pietzcker
fonte
-1

é assim que você pode analisar arquivos iCal com 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
fonte