在javascript中将字符串分割一次?


Answers:


77

这不是一个很漂亮的方法,但是效率很高:

var string = "1|Ceci n'est pas une pipe: | Oui";
var components = string.split('|');
alert([components.shift(), components.join('|')]​);​​​​​

这是它的快速演示


我认为这实际上比正则表达式更好。选择正确,谢谢!
Stavros Korokithakis,2010年

2
为了明确起见,他将其分为N个部分,然后将第一个部分弹出到列表中,然后将其余部分加入到同一列表中。
Stavros Korokithakis 2010年

如果要从字符串而不是1中获得k个标记,请执行上述操作,不同之处在于,使用components.splice(0,k)代替components.shift()。
D Coetzee 2013年

对于那些想知道如何使用2个或更多卡盘的用户,可以循环使用shift或:components.splice(0,2).slice(0,2)
Ultimater 2014年

113

您想使用它String.indexOf('|')来获取首次出现的“ |”的索引。

var i = s.indexOf('|');
var splits = [s.slice(0,i), s.slice(i+1)];

17
不如尼克的“有趣”,但可能更有效。另请注意+1,如果超过一个字符,则实际上应为分隔符字符串的长度。
devios1'2

为什么这种解决方案不那么“有趣”?
Bentley4年

对于那些好奇的人,要用2个或更多块来执行此操作,可以在循环中使用indexOf或:var i = s.split('|',2).join('|').length;//2nd index var splits = [s.slice(0,i).split('|'), s.slice(i+1)];
Ultimater

6
当IndexOf返回-1时,这不能像split那样工作(例如,如果var s ='string',它将返回['strin','string'])。您将必须编写一个条件。
JJJ 2015年

14

您可以使用:

var splits = str.match(/([^|]*)\|(.*)/);
splits.shift();

正则表达式将字符串分成两个匹配的组(用括号括起来),第一个|前面的文本 和之后的文字。然后,我们shift得到摆脱整个字符串匹配(splits[0])的结果。


1
适当地,那应该在一开始就锚定了。但是javascript regexen似乎很贪婪。
muhmuhten 2010年

6

一个线性和imo,更简单:

var str = 'I | am super | cool | yea!';
str.split('|').slice(1).join('|');

这将返回“超级|很酷|是!”


3
这不是要求的,他们也在寻找缺少的第一部分。
SmujMaiku '17

5

ES6语法允许使用其他方法:

function splitOnce(s, on) {
   [first, ...rest] = s.split(on)
   return [first, rest.length > 0? rest.join(on) : null]
}

这也|通过返回null而不是空字符串来处理不具有a的字符串的可能性,这更加明确。

splitOnce("1|Ceci n'est pas une pipe: | Oui", "|")
>>> ["1", "Ceci n'est pas une pipe: | Oui"]

splitOnce("Celui-ci n'a pas de pipe symbol!", "|")
>>> ["Celui-ci n'a pas de pipe symbol!", null]

Pas de pipe?没有空!

我添加此回复的主要目的是使我可以对竖线符号进行双关语,同时也可以展示es6语法-令人惊讶的是仍然有很多人不使用它...


3

试试这个:

function splitOnce(input, splitBy) {
    var fullSplit = input.split(splitBy);
    var retVal = [];
    retVal.push( fullSplit.shift() );
    retVal.push( fullSplit.join( splitBy ) );
    return retVal;
}

var whatever = splitOnce("1|Ceci n'est pas une pipe: | Oui", '|');

3

如果该字符串不包含定界符,则@NickCraver的解决方案仍将返回包含两个元素的数组,第二个为空字符串。我更喜欢行为与分裂的行为相匹配。也就是说,如果输入字符串不包含定界符,则仅返回具有单个元素的数组。

var splitOnce = function(str, delim) {
    var components = str.split(delim);
    var result = [components.shift()];
    if(components.length) {
        result.push(components.join(delim));
    }
    return result;
};

splitOnce("a b c d", " "); // ["a", "b c d"]
splitOnce("a", " "); // ["a"]

1

与到目前为止的大多数答案一样邪恶:

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

0

除了其他地方的货物以外,另一种替代的简短方法是利用replace()的限制来获取您的利益。

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

正如@sreservoir在评论中指出的那样,唯一短语必须是真正唯一的-它不能在运行此拆分的源中出现,否则您会将字符串拆分成比您想要的更多的片段。如他所说,如果您要根据用户输入(例如,在浏览器中键入)运行此字符,则可能会出现无法打印的字符。


仅在“唯一”短语不可输入的情况下有效。如果从文本文件读取,则不可能。如果从浏览器中读取,则任何可能无法打印的控制字符(如果可能)都可以。标签也能创造奇迹。在任何情况下,“ aUniquePhraseToSaySplitMe”几乎绝对可能是输入的一部分,因此很危险。
muhmuhten 2010年

你是正确的,当然。我的示例只是一个示例,旨在简洁地说明正在执行的操作。我将把您的观点纳入答案本身。谢谢!

如果将str用作唯一短语,那么您就知道它不再存在了!:evil grin
Fabio Beltramini

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 [];

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

更有效的方法:

const str = "1|Ceci n'est pas une pipe: | Oui"

const [head] = str.split('|', 1);

const result = [head, str.substr(head.length + 1)]

console.log(result);


-1

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

RE可能看起来像/^([^|]*)\|/

实际上,/[^|]*/由于javascript regex的贪婪性,您仅需要验证字符串是否以这种方式格式化即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.