2011-04-21 12 views
7

Estoy analizando algunos pares de valores clave que están separados por dos puntos. El problema que tengo es que en la sección de valores hay dos puntos que quiero ignorar, pero la función split los está recogiendo de todos modos.Javascript dividir solo una vez e ignorar el resto

muestra:

Name: my name 
description: this string is not escaped: i hate these colons 
date: a date 

En las líneas individuales que trató este line.split(/:/, 1) pero sólo igualó la parte del valor de los datos. Luego intenté line.split(/:/, 2) pero eso me dio ['description', 'this string is not escaped'] y necesito toda la cadena.

¡Gracias por la ayuda!

Respuesta

12
a = line.split(/:/); 
key = a.shift(); 
val = a.join(':'); 
10

Use el operador no expansivo (?) solamente para dividir la primera instancia.

line.split(/: (.+)?/, 2);

+0

+1 manera más elegante que mi solución. – awm

+0

esto no funcionó. Las cadenas en la sección de valores se rompen por completo. – babsher

+0

''descripción: esta cadena no se ha escapado: odio estos colons'.split (/: (. +)? /, 2);' regresa para mí '[" description "," esta cadena no se ha escapado: odio estos dos puntos "]' ¿Qué te devuelve? – JaredMcAteer

2

Si prefiere una alternativa a considerar esta expresión regular:

var split = line.split(':'); 
var key = split[0]; 
var val = split.slice(1).join(":"); 

Referencia: split, slice, .

1

Un poco más elegante:

a = line.match(/(.*?):(.*)/); 
key = a[1]; 
val = a[2]; 
0

puede ser este enfoque será la mejor para tal fin:

var a = line.match(/([^:\s]+)\s*:\s*(.*)/); 
var key = a[1]; 
var val = a[2]; 

Por lo tanto, se puede utilizar tabulaciones en tu config/archivos de datos de dicha estructura y tampoco se preocupe por los espacios antes o después de su delimitador de nombre-valor ':'.

O puede utilizar las funciones de cadena primitiva y rápido indexOf y substr para llegar a su objetivo en, creo, la manera más rápida (por la CPU y la RAM)

for (... line ...) { 
    var delimPos = line.indexOf(':'); 
    if (delimPos <= 0) { 
     continue; // Something wrong with this "line" 
    } 
    var key = line.substr(0, delimPos).trim(); 
    var val = line.substr(delimPos + 1).trim(); 

    // Do all you need with this key: val 
} 
Cuestiones relacionadas