在JavaScript中如何一次性拆分字符串?

100

如何仅将字符串拆分一次,即使得1 | Ceci n'est pas une pipe: | Oui解析为:["1","Ceci n'est pas une pipe: | Oui"]

使用split中的limit似乎无法实现...


我不知道2010年的情况如何,但今天大多数使用.split的解决方案比`s.indexOf(...); s.slice(); /* OR: s.substring() */差得多。在Chrome和NodeJS中,“差得多”意味着它们慢了约90%。 - maxkoryukov
17个回答

1

就像迄今为止大多数答案一样邪恶:

var splits = str.split('|');
splits.splice(1, splits.length - 1, splits.slice(1).join('|'));

1

除了其他好的方法外,另一个简洁的方法是利用replace()的限制。

var str = "1|Ceci n'est pas une pipe: | Oui";
str.replace("|", "aUniquePhraseToSaySplitMe").split("aUniquePhraseToSaySplitMe");

正如@sreservoir在评论中指出的那样,唯一的短语必须是真正独特的——它不能在你正在运行此拆分的源代码中,否则你将得到比你想要的更多的字符串拆分。正如他所说,如果你正在针对用户输入(即在浏览器中键入)运行此操作,则可能会使用不可打印字符。

只有当“unique”短语无法输入时,才能起作用。如果从文本文件中读取,则不可能。如果从浏览器中读取,则任何不可打印的控制字符都可以使用。制表符也很有效。无论如何,“aUniquePhraseToSaySplitMe”几乎肯定可能是输入的一部分,因此是危险的。 - muhmuhten
当然,你是正确的。我的例子只是为了简洁地解释正在进行的事情而提供的一个例子。我会将你的观点融入到答案中。谢谢! - user241244
如果您使用“str”作为您的唯一短语,那么您知道它不会再次出现!: 邪恶的笑容 - Fabio Beltramini

0
var str = "1|Ceci n'est pas une pipe: | Oui";
str.split(/(?<!\|.*)\|/s);

使用这个正则表达式,它会找到第一个"|"之前没有"|",也就是只匹配第一个"|"。


0

如果你想使用“管道”,reduce 是你的好朋友

const separator = '|'
jsonNode.split(separator)
   .reduce((previous, current, index) =>
    {
        if (index < 2) previous.push(current)
        else previous[1] += `${separator}${current}`
        return previous
    }, [])
    .map((item: string) => (item.trim()))
    .filter((item: string) => (item != ''))

0

这是一个老问题,但如果您需要循环遍历字符串,并且有多个分隔符,请使用正则表达式进行匹配,像这样:

let exampleRegexp = />|<|=|\||(?:and|not|etc)/

let strings = ["left | middle | right", "yes and not yes"]

function splitOnce(str, regexp){
    let check = regexp.exec(str)
    let tail = str.slice(check.index + check.toString().length)
    let head = str.substring(0, check.index)
    return [head, tail]
}

for(let str of strings){
    let [head, tail] = splitOnce(str, exampleRegexp)
    console.log(head + ":::" + tail)
}


0

这个有点长,但它的工作方式就像我认为的限制应该的那样:

function split_limit(inString, separator, limit){
    var ary = inString.split(separator);
    var aryOut = ary.slice(0, limit - 1);
    if(ary[limit - 1]){
        aryOut.push(ary.slice(limit - 1).join(separator));
    }
    return aryOut;
}
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 1));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 2));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 3));
console.log(split_limit("1|Ceci n'est pas une pipe: | Oui","|", 7));

https://jsfiddle.net/2gyxuo2j/

零的限制会返回有趣的结果,但为了效率,我省略了对它的检查。如果需要,您可以将其添加为函数的第一行:

if(limit < 1) return [];

-1

使用JavaScript正则表达式功能并获取第一个捕获的表达式。

正则表达式可能看起来像/^([^|]*)\|/

实际上,如果您验证了字符串以这种方式格式化,由于JavaScript正则表达式的贪婪性,您只需要/[^|]*/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接