【问题标题】:Split string once in javascript?在javascript中拆分字符串一次?
【发布时间】:2011-02-22 03:36:33
【问题描述】:

我怎样才能将一个字符串只拆分一次,即让1|Ceci n'est pas une pipe: | Oui解析为:["1", "Ceci n'est pas une pipe: | Oui"]

拆分的限制似乎没有帮助......

【问题讨论】:

    标签: javascript split


    【解决方案1】:

    你可以使用:

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

    正则表达式将字符串分成两个匹配组(带括号),第一个 | 前面的文本和后面的文字。然后,我们将shift的结果去掉整个字符串匹配(splits[0])。

    【讨论】:

    • 正确地,这可能应该在开始时锚定。但是 javascript regexen 似乎很贪心。
    【解决方案2】:

    试试这个:

    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】:

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

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

      Here's a quick demo of it

      【讨论】:

      • 我认为这实际上比正则表达式更好。选择正确,谢谢!
      • 为了澄清,他分成 N 个部分,然后将第一个部分弹出到一个列表中,并将其余部分加入到同一个列表中。
      • 如果你想从字符串中获取 k 个标记而不是 1,除了使用 components.splice(0,k) 而不是 components.shift() 之外,执行与上述相同的操作。
      • 对于那些想知道如何使用 2 个或更多夹头的人,您可以在循环中使用 shift 或:components.splice(0,2).slice(0,2)
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        您可能想使用String.indexOf('|') 来获取“|”第一次出现的索引。

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

        【讨论】:

        • 不像尼克那样“有趣”,但可能更有效。另请注意,+1 实际上应该是分隔符字符串的长度(如果有多个字符)。
        • 为什么这个解决方案不那么“有趣”?
        • 对于那些想用 2 个或更多块执行此操作的人,您可以在循环中使用 indexOf 或:var i = s.split('|',2).join('|').length;//2nd indexvar splits = [s.slice(0,i).split('|'), s.slice(i+1)];
        • 当 IndexOf 返回 -1 时,这不像 split 那样工作(例如,如果 var s='string' 它将返回 ['strin','string'])。你必须写一个条件。
        • 函数看起来不错,但是当indexOf 返回-1 时会失败,如果在字符串s 中找不到| 字符,就会失败。
        【解决方案6】:

        与目前大多数答案一样邪恶:

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

        【讨论】:

          【解决方案7】:

          除了其他地方的商品之外,另一种简短的方法是利用replace() 的限制来发挥自己的优势。

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

          正如@sreservoir 在 cmets 中指出的那样,唯一的短语必须是真正唯一的——它不能在您运行此拆分的源中,否则您会将字符串拆分成比您想要的更多的部分。正如他所说,如果您针对用户输入(即在浏览器中键入)运行此命令,则可能会出现不可打印的字符。

          【讨论】:

          • 只有在 'unique' 短语不可输入时才有效。如果从文本文件中读取,这是不可能的。如果从浏览器读取,任何不可打印的控制字符都可以。标签也能创造奇迹。无论如何,“aUniquePhraseToSaySplitMe”几乎肯定是输入的一部分,因此很危险。
          • 你是对的,当然。我的例子只是一个例子,着眼于简明地解释正在做什么。我会将您的观点纳入答案本身。谢谢!
          • 如果您使用 str 作为您的独特短语,您就知道它不能再出现了! :邪恶的笑容
          【解决方案8】:

          一个班轮和 imo,更简单:

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

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

          【讨论】:

          • 这不是所要求的,他们也在寻找丢失的第一部分。
          【解决方案9】:

          如果字符串不包含分隔符@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"]
          

          【讨论】:

            【解决方案10】:

            这个有点长,但它的工作原理就像我认为 limit 应该的那样:

            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/

            limit of Zero 返回有趣的结果,但以效率的名义,我省略了检查。如果需要,可以将其添加为函数的第一行:

            if(limit < 1) return [];
            

            【讨论】:

              【解决方案11】:

              ES6 语法允许使用不同的方法:

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

              它还通过返回 null 而不是空字符串来处理没有| 的字符串的可能性,这更明确。

              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]
              

              帕德管? C'est null!

              我添加这个回复主要是为了在管道符号上打一个双关语,同时也是为了炫耀 es6 语法 - 令人惊讶的是有多少人仍然不使用它...

              【讨论】:

                【解决方案12】:

                如果你想使用“管道”,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 != ''))
                

                【讨论】:

                  【解决方案13】:

                  更有效的方法:

                  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);

                  【讨论】:

                    【解决方案14】:

                    这是一个老问题,但如果你需要遍历字符串, 并有多个分隔符,为您的匹配案例使用正则表达式, 像这样:

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

                    【讨论】:

                      【解决方案15】:

                      您还可以在匹配所有内容的正则表达式上进行拆分

                      const str = "one | two | three | four"
                      const [first, second] = str.split(/\|(.*)/s) // [ 'one ', ' two | three | four', '' ]
                      

                      我不知道为什么会有一个空字符串,你可以忽略它。只是不要忘记在正则表达式的末尾添加s(参见documentation),否则它会拆分到第一个换行符。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-01-13
                        • 1970-01-01
                        • 2017-12-15
                        • 2021-08-12
                        • 2012-05-14
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-03-16
                        相关资源
                        最近更新 更多