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

ckx4rj1h  于 2022-12-25  发布在  Java
关注(0)|答案(7)|浏览(144)

我正在解析一些用冒号分隔的键值对,我遇到的问题是在值部分有一些我想忽略的冒号,但是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'],我需要整个字符串。
谢谢你的帮助!

bybem2ql

bybem2ql1#

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

5cg8jx4n2#

使用greedy运算符(?)仅拆分第一个示例。
line.split(/: (.+)?/, 2);

l7wslrjt

l7wslrjt3#

如果您喜欢regexp的替代方案,请考虑以下内容:

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

参考:splitslicejoin

z6psavjg

z6psavjg4#

稍微优雅一点:

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

tcomlyy65#

也许这种方法将是最好的为这样的目的:

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
}
px9o7tmv

px9o7tmv6#

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

仅在第一列出现时拆分具有多列(即:列)的字符串

使用正向后视(?<=)

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

brqmpdu1

brqmpdu17#

function splitOnce(str, sep) {
  const idx = str.indexOf(sep);
  return [str.slice(0, idx), str.slice(idx+1)];
}
splitOnce("description: this string is not escaped: i hate these colons", ":")

相关问题