1

在 Python 中,有很好的旧firstline, rest = text.split("\n", 1). 在经历了一些痛苦的发现之后,我意识到 JavaScript 赋予了limit属性不同的含义,并返回了那么多“拆分”(1 表示它只返回第一行,2 只返回前两行,依此类推)。

获得我想要的东西的最佳方式是什么?我必须与sliceand凑合indexOf吗?

4

4 回答 4

3

可能是最有效的方法:

function getFirstLine(text) {
    var index = text.indexOf("\n");
    if (index === -1) index = undefined;
    return text.substring(0, index);
}

然后:

// "Some string goes here"
console.log(getFirstLine("Some string goes here\nSome more string\nAnd more\n\nMore"));
// "asdfasdfasdf"
console.log(getFirstLine("asdfasdfasdf"));

编辑:

function newSplit(text, lineSplit) {
    if (lineSplit <= 0) return null;

    var index = -1;
    for (var i = 0; i < lineSplit; i++) {
        index = text.indexOf("\n", index) + 1;
        if (index === 0) return null;
    }

    return { 0: text.substring(0, index - 1), 1: text.substring(index) }
}

输出:

newSplit("someline\nasdfasdf\ntest", 1);
    > Object {0: "someline", 1: "asdfasdf↵test"}
newSplit("someline\nasdfasdf\ntest", 2);
    > Object {0: "someline↵asdfasdf", 1: "test"}
newSplit("someline\nasdfasdf\ntest", 0);
    > null
newSplit("someline\nasdfasdf\ntest", 3);
    > null
于 2013-07-17T13:34:20.653 回答
3

您可以使用shift从数组中删除第一项。

var lines = text.split("\n");   // split all lines into array
var firstline = lines.shift();   // read and remove first line
var rest = lines.join("\n");     // re-join the remaining lines

这可能在规范上最接近您在 Python 中所做的工作,但它几乎不是最有效的方法。

于 2013-07-17T13:33:31.557 回答
0

另一种可能性,使用带有String.matchand的正则表达式Array.slice

Javascript

var text = "Simple Simon met a Pieman,\ngoing to a fair.\nSaid simple Simon to the Pieman,\n\n\"Let me taste your ware.\"";

console.log((text.match(/^([\s\S]*?)\n([\s\S]*)$/) || []).slice(1, 3));

输出

["Simple Simon met a Pieman,", "going to a fair.↵Said simple Simon to the Pieman,↵↵"Let me taste your ware.""] 

jsfiddle 上

于 2013-07-17T14:21:27.360 回答
0

RegExp.exec() 方法可以解决问题:

//some multiline text
var text='line1\nline2'
//exec puts the first line in an array
var firstline=/.*/.exec(text)[0]

REPL 输出:

>>> firstline
line1

当正则表达式保存为具有全局和多行标志的对象时,可以使用 exec 单步执行循环中的每一行,在 jsc REPL 中手动显示:

>>> var reg = /^.*/gm
>>> var text='line1\nline2'
>>> reg.exec(text)
line1
>>> reg.exec(text)
line2
>>> reg.exec(text)
null
于 2020-12-17T17:23:40.020 回答