2011-04-21 97 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 
} 
相關問題