Come estrarre una stringa usando JavaScript Regex?


133

Sto cercando di estrarre una sottostringa da un file con JavaScript Regex. Ecco una sezione dal file:

DATE:20091201T220000
SUMMARY:Dad's birthday

il campo che voglio estrarre è "Riepilogo". Ecco l'approccio:

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

Risposte:


88

Devi usare la m bandiera :

multilinea; considera l'inizio e la fine dei caratteri (^ e $) come se lavorassero su più righe (cioè corrispondano all'inizio o alla fine di ogni riga (delimitata da \ n o \ r), non solo all'inizio o alla fine dell'intera stringa di input)

Metti anche il *nel posto giusto:

"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]; 
}

Hai bisogno di questi cambiamenti:

  • Metti l' *interno tra parentesi come suggerito sopra. Altrimenti il ​​tuo gruppo corrispondente conterrà solo un carattere.

  • Sbarazzarsi di ^ e $. Con l'opzione globale corrispondono all'inizio e alla fine dell'intera stringa, anziché all'inizio e alla fine delle righe. Abbina invece su righe esplicite.

  • Suppongo che tu voglia il gruppo corrispondente (cosa c'è dentro la parentesi) piuttosto che l'array completo? arr[0]è la corrispondenza completa ("\nSUMMARY:..." ) e gli indici successivi contengono le corrispondenze di gruppo.

  • String.match (regexp) dovrebbe restituire un array con le corrispondenze. Nel mio browser non funziona (Safari su Mac restituisce solo la corrispondenza completa, non i gruppi), ma Regexp.exec (stringa) funziona.


1
Combinerei questo con quello di @barkmadley || [null, null]poiché se l'incontro fallisse arrsarebbe nullo e arr[1]farebbe un'eccezione
Kunal

22

La tua espressione regolare molto probabilmente vuole essere

/\nSUMMARY:(.*)$/g

Un piccolo trucco utile che mi piace usare è quello di assegnare in modo predefinito sulla partita con un array.

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

In questo modo non si ottengono fastidiosi errori di tipo quando si utilizza arr


2
matchrestituisce un valore nullo se non vi è corrispondenza
Kunal

7

(.*) invece di (.)* sarebbe un inizio. Quest'ultimo catturerà solo l'ultimo personaggio sulla linea.

Inoltre, non è necessario sfuggire al :.


-1

ecco come analizzare i file iCal con 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.