2011-04-21 67 views
7

我解析了一些由冒号分隔的键值对。我遇到的问题是,在价值部分有冒号,我想忽略但split函数正在挑选它们。JavaScript分裂一次,忽略其余

样品:

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

在各条线我尝试这样line.split(/:/, 1)但只匹配了数据的值的部分。接下来我尝试了line.split(/:/, 2),但那给了我['description', 'this string is not escaped'],我需要整个字符串。

感谢您的帮助!

回答

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

使用非贪婪算子(?)仅分割第一个实例。

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

+0

+1路比我的解决方案更优雅。 – awm 2011-04-21 16:21:51

+0

这没有奏效。值部分中的字符串全部分解。 – babsher 2011-04-21 16:23:08

+0

''描述:这个字符串不会被转义:我讨厌这些冒号'.split(/:(。+)?/,2);'为我返回'[“description”,“这个字符串不会被转义:这些冒号“]'它为您带来了什么? – JaredMcAteer 2011-04-21 16:27:54

2

如果你喜欢一个替代正则表达式考虑这个问题:

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

参考:splitslice,。

1

稍微更优雅:

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

可能是这种做法将是最适合这样的目的:

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

所以,你可以在你的配置使用的制表/这样结构的数据文件和也不用担心名称 - 分隔符':'之前或之后的空格。

或者你也可以使用原始的和快速的字符串函数indexOfsubstr(由CPU和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 
}