2011-04-21 2 views
7

J'examine certaines paires de valeurs clés séparées par des deux-points. Le problème que j'ai est que dans la section de valeur il y a des deux-points que je veux ignorer mais la fonction split les ramasse de toute façon.Javascript ne divise qu'une seule fois et ignore le reste

échantillon

:

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

Sur les lignes individuelles j'ai essayé cette line.split(/:/, 1) mais elle ne correspondait à la partie de la valeur des données. Ensuite, j'ai essayé line.split(/:/, 2) mais cela m'a donné ['description', 'this string is not escaped'] et j'ai besoin de toute la chaîne.

Merci pour l'aide!

Répondre

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

L'opérateur non avide (?) à seulement diviser la première instance.

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

+0

+1 façon plus élégante que ma solution. – awm

+0

cela n'a pas fonctionné. Les chaînes de la section de valeur sont toutes décomposées. – babsher

+0

''description: cette chaîne n'est pas échappée: je déteste ces colons'.split (/: (. +)? /, 2);' retourne pour moi '[" description "," cette chaîne n'est pas échappée: je déteste ces colons "]' Qu'est-ce que ça vous rend? – JaredMcAteer

2

Si vous préférez une alternative à considérer cette expression rationnelle:

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

Référence: split, slice, .

1

Un peu plus élégant:

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

peut être cette approche sera le meilleur à cette fin:

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

Ainsi, vous pouvez utiliser des tableaux dans votre config/fichiers de données de cette structure et ne vous inquiétez pas non plus des espaces avant ou après votre délimiteur de valeur-nom ':'.

Ou vous pouvez utiliser les fonctions de chaîne primitive et rapide indexOf et substr pour atteindre votre objectif dans, je pense, la plus rapide (par CPU et 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 
} 
Questions connexes