¿Cómo extraer una cadena usando JavaScript Regex?

133

Estoy tratando de extraer una subcadena de un archivo con JavaScript Regex. Aquí hay una porción del archivo:

DATE:20091201T220000
SUMMARY:Dad's birthday

el campo que quiero extraer es "Resumen". Aquí está el enfoque:

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

Respuestas:

88

Necesitas usar la m bandera :

multilínea trate los caracteres iniciales y finales (^ y $) como trabajando en varias líneas (es decir, haga coincidir el principio o el final de cada línea (delimitado por \ n o \ r), no solo el principio o el final de toda la cadena de entrada)

También ponga el *en el lugar correcto:

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

Necesita estos cambios:

  • Ponga el *interior del paréntesis como se sugirió anteriormente. De lo contrario, su grupo coincidente contendrá solo un personaje.

  • Deshazte de la ^y $. Con la opción global, coinciden al inicio y al final de la cadena completa, en lugar de al inicio y al final de las líneas. Coincidir en líneas nuevas explícitas en su lugar.

  • Supongo que desea el grupo coincidente (¿qué hay dentro del paréntesis) en lugar de la matriz completa? arr[0]es la coincidencia completa ( "\nSUMMARY:...") y los siguientes índices contienen las coincidencias de grupo.

  • Se supone que String.match (regexp) devuelve una matriz con las coincidencias. En mi navegador no lo hace (Safari en Mac solo devuelve la coincidencia completa, no los grupos), pero Regexp.exec (cadena) funciona.

jg-faustus
fuente
1
Combinaría esto con el de @barkmadley || [null, null]ya que si el partido falla, arrsería nulo y arr[1]arrojaría una excepción
Kunal,
22

Su expresión regular probablemente quiere ser

/\nSUMMARY:(.*)$/g

Un pequeño truco útil que me gusta usar es asignar por defecto en el partido con una matriz.

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

De esta manera no obtienes errores de tipo molestos cuando vas a usar arr

Barkmadley
fuente
2
matchdevuelve un valor nulo si no hay coincidencia
Kunal
7

(.*)en lugar de (.)*sería un comienzo. Este último solo capturará el último personaje de la línea.

Además, no es necesario escapar del :.

Tim Pietzcker
fuente
-1

así es como puede analizar archivos 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);
usuario187291
fuente