Javascript只拆分一次并忽略其余部分

时间:2011-04-21 16:12:49

标签: javascript regex split

我正在解析一些由冒号分隔的键值对。我遇到的问题是,在值部分中有冒号我想忽略但是split函数无论如何都要将它们拾起。

样品:

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'],我需要整个字符串。

感谢您的帮助!

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:10)

使用非贪婪的运算符(?)仅拆分第一个实例。

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

答案 2 :(得分:2)

如果您更喜欢regexp的替代方案,请考虑以下事项:

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

参考:splitslicejoin

答案 3 :(得分:0)

稍微优雅一点:

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

答案 4 :(得分: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
}

答案 5 :(得分:0)

第一次出现时将字符串一分为二

仅在第一列出现处拆分具有多个即列:的字符串
使用 Positive Lookbehind (?<=)

const a = "Description: this: is: nice";
const b = "Name: My Name";

console.log(a.split(/(?<=^[^:]*):/)); // ["Description", " this: is: nice"]
console.log(b.split(/(?<=^[^:]*):/)); // ["Name", " My Name"]

它基本上从字符串开始 ^ 所有非列 [^:] 零次或多次 > *。完成正向后视后,最终匹配列 :

如果您还想删除列后面的一个或多个空格,
使用 /(?<=^[^:]*): */

Explanation on Regex101.com