【问题标题】:How do I split a string with multiple separators in JavaScript?如何在 JavaScript 中拆分具有多个分隔符的字符串?
【发布时间】:2010-10-13 14:18:40
【问题描述】:

如何在 JavaScript 中拆分具有多个分隔符的字符串?

我试图在 commas空格 上进行分割,但 AFAIK JavaScript 的 split() 函数只支持一个分隔符。

【问题讨论】:

  • 我在尝试拆分 Windows 下使用 nodejs 构建的文件路径时遇到了这个问题。同一路径中有时会出现正斜杠“/”和反斜杠“\”。

标签: javascript regex split


【解决方案1】:

不是最好的方法,但可以使用多个不同的分隔符/分隔符进行拆分

html

<button onclick="myFunction()">Split with Multiple and Different seperators/delimiters</button>
<p id="demo"></p>

javascript

<script>
function myFunction() {

 var str = "How : are | you doing : today?";
 var res = str.split(' | ');

 var str2 = '';
 var i;
 for (i = 0; i < res.length; i++) { 
    str2 += res[i];
    
    if (i != res.length-1) {
      str2 += ",";
    }
 }
 var res2 = str2.split(' : ');

 //you can add countless options (with or without space)

 document.getElementById("demo").innerHTML = res2;
}
</script>

【讨论】:

    【解决方案2】:

    Github上查看我的简单库

    如果你真的不想访问或与 repo 交互,这里是工作代码:

    /**
     * 
     * @param {type} input The string input to be split
     * @param {type} includeTokensInOutput If true, the tokens are retained in the splitted output.
     * @param {type} tokens The tokens to be employed in splitting the original string.
     * @returns {Scanner}
     */
    function Scanner(input, includeTokensInOutput, tokens) {
        this.input = input;
        this.includeTokensInOutput = includeTokensInOutput;
        this.tokens = tokens;
    }
    
    Scanner.prototype.scan = function () {
        var inp = this.input;
    
        var parse = [];
        this.tokens.sort(function (a, b) {
            return b.length - a.length; //ASC, For Descending order use: b - a
        });
        for (var i = 0; i < inp.length; i++) {
    
    
            for (var j = 0; j < this.tokens.length; j++) {
    
                var token = this.tokens[j];
                var len = token.length;
                if (len > 0 && i + len <= inp.length) {
                    var portion = inp.substring(i, i + len);
                    if (portion === token) {
                        if (i !== 0) {//avoid empty spaces
                            parse[parse.length] = inp.substring(0, i);
                        }
                        if (this.includeTokensInOutput) {
                            parse[parse.length] = token;
                        }
                        inp = inp.substring(i + len);
                        i = -1;
                        break;
                    }
    
                }
    
            }
    
        }
        if (inp.length > 0) {
              parse[parse.length] = inp;
        }
    
        return parse;
    
    
    };
    

    用法很简单:

        var tokens = new Scanner("ABC+DE-GHIJK+LMNOP", false , new Array('+','-')).scan();
    
    console.log(tokens); 
    

    给予:

    ['ABC', 'DE', 'GHIJK', 'LMNOP']
    

    如果您希望在输出中包含拆分标记(+ and -),请将false 设置为true,瞧!它仍然有效。

    现在的用法是:

    var tokens = new Scanner("ABC+DE-GHIJK+LMNOP", true , new Array('+','-')).scan();
    

    console.log(tokens);
    

    会给:

    ['ABC', '+', 'DE', '-', 'GHIJK', '+', 'LMNOP']
    

    尽情享受吧!

    【讨论】:

      【解决方案3】:

      我很惊讶还没有人建议它,但我的 hack-ey(而且非常快)的解决方案是在由同一个字符分割之前附加几个“替换”调用。

      即删除 a、b、c、d 和 e:

      let str = 'afgbfgcfgdfgefg'
      let array = str.replace('a','d').replace('b','d').replace('c','d').replace('e','d').split('d')
      

      这可以方便地概括为一个拆分器数组,如下所示:

      function splitByMany( manyArgs, string ) {
        do {
          let arg = manyArgs.pop()
          string = string.replace(arg, manyArgs[0])
        } while (manyArgs.length > 2)
        return string.split(manyArgs[0])
      }
      

      所以,在你的情况下,你可以打电话

      let array = splitByMany([" ", ","], 'My long string containing commas, and spaces, and more commas');
      

      【讨论】:

        【解决方案4】:

        我用 reduce 和 filter 解决了这个问题。它可能不是最易读或最快的解决方案,在现实生活中我可能会使用Aarons answere here,但写起来很有趣。

        [' ','_','-','.',',',':','@'].reduce(
        (segs, sep) => segs.reduce(
        (out, seg) => out.concat(seg.split(sep)), []), 
        ['E-mail Address: user@domain.com, Phone Number: +1-800-555-0011']
        ).filter(x => x)
        

        或者作为一个函数:

        function msplit(str, seps) {
          return seps.reduce((segs, sep) => segs.reduce(
            (out, seg) => out.concat(seg.split(sep)), []
          ), [str]).filter(x => x);
        }
        

        这将输出:

        ['E','mail','Address','user','domain','com','0','Phone','Number','+1','800','555','0011']
        

        如果最后没有过滤器,您将在数组中得到空字符串,其中两个不同的分隔符彼此相邻。

        【讨论】:

          【解决方案5】:

          以下是一些使用正则表达式可能会有所帮助的情况:

          • \W 匹配任何字符,否则为单词字符[a-zA-Z0-9_]。示例:
          ("Hello World,I-am code").split(/\W+/); // would return [ 'Hello', 'World', 'I', 'am', 'code' ]
          
          • \s+ 匹配一个或多个空格
          • \d 匹配一个数字
          • 如果你只想用一些字符分割,让我们说,-你可以使用str.split(/[,-]+/)...等

          【讨论】:

            【解决方案6】:

            您可以将正则表达式传递给 JavaScript 的 split() 方法。例如:

            "1,2 3".split(/,| /) 
            ["1", "2", "3"]
            

            或者,如果您希望多个分隔符一起仅作为一个:

            "1, 2, , 3".split(/(?:,| )+/) 
            ["1", "2", "3"]
            

            (您必须使用非捕获 (?:) 括号,否则它会被拼接回结果中。或者您可以像 Aaron 一样聪明并使用字符类。)

            在 Safari 和 Firefox 中测试的示例。

            【讨论】:

            • 如果您需要多个字符作为一个字符,例如“one;#two;#new jersey”,您可以简单地将字符串“;#”传递给 split 函数。 "one;#two;#new jersey".split(";#")[2] === "new jersey"
            • 如果您需要拆分多个字符,此方法比字符类效果更好。如 Jesse 所示,用| 将它们分开。
            • 我想知道在用正则表达式拆分字符串时是否有办法避免删除分隔符:这个例子删除了分隔符,但我希望可以在不删除它们的情况下拆分字符串。
            • @AndersonGreen 这完全取决于你想要什么;在这种情况下,有多个分隔符,所以你想保留它们吗?作为一个单独的项目?加入上一个项目?下一个项目?我似乎不清楚。您可能想用一些您正在寻找的示例提出一个新问题。
            • @JesseRusak 我的意思是将所有分隔符作为单独的项目,以便可以使用分隔符列表对字符串进行标记。
            【解决方案7】:

            我在寻找 C# string.Split() 函数的替代品时遇到了这个问题,该函数使用参数中的字符分割字符串。

            在 JavaScript 中,您可以使用 map 和 reduce 来迭代拆分字符和中间值:

            let splitters = [",", ":", ";"]; // or ",:;".split("");
            let start= "a,b;c:d";
            let values = splitters.reduce((old, c) => old.map(v => v.split(c)).flat(), [start]);
            // values is ["a", "b", "c", "d"]
            

            flat() 用于展平中间结果,因此每次迭代都在没有嵌套数组的字符串列表上工作。每次迭代都将 split 应用于 old 中的所有值,然后返回中间结果列表,这些结果将被拆分器中的下一个值拆分。 reduce() 使用包含初始字符串值的数组进行初始化。

            【讨论】:

              【解决方案8】:

              通过 .com/.net/

              分割 URL
              url.split(/\.com\/|\.net\//)
              

              【讨论】:

                【解决方案9】:

                我对@Brian 答案的重构

                var string = 'and this is some kind of information and another text and simple and some egample or red or text';
                var separators = ['and', 'or'];
                
                function splitMulti(str, separators){
                            var tempChar = 't3mp'; //prevent short text separator in split down
                            
                            //split by regex e.g. \b(or|and)\b
                            var re = new RegExp('\\b(' + separators.join('|') + ')\\b' , "g");
                            str = str.replace(re, tempChar).split(tempChar);
                            
                            // trim & remove empty
                            return str.map(el => el.trim()).filter(el => el.length > 0);
                }
                
                console.log(splitMulti(string, separators))

                【讨论】:

                  【解决方案10】:

                  我将为这样的功能提供一个经典的实现。该代码几乎适用于所有版本的 JavaScript,并且在某种程度上是最佳的。

                  • 不使用正则表达式,难以维护
                  • 它不使用 JavaScript 的新功能
                  • 它不使用需要更多计算机内存的多个 .split() .join() 调用

                  纯代码:

                  var text = "Create a function, that will return an array (of string), with the words inside the text";
                  
                  println(getWords(text));
                  
                  function getWords(text)
                  {
                      let startWord = -1;
                      let ar = [];
                  
                      for(let i = 0; i <= text.length; i++)
                      {
                          let c = i < text.length ? text[i] : " ";
                  
                          if (!isSeparator(c) && startWord < 0)
                          {
                              startWord = i;
                          }
                  
                          if (isSeparator(c) && startWord >= 0)
                          {
                              let word = text.substring(startWord, i);
                              ar.push(word);
                  
                              startWord = -1;
                          }
                      }
                  
                      return ar;
                  }
                  
                  function isSeparator(c)
                  {
                      var separators = [" ", "\t", "\n", "\r", ",", ";", ".", "!", "?", "(", ")"];
                      return separators.includes(c);
                  }
                  

                  您可以看到在 Playground 中运行的代码: https://codeguppy.com/code.html?IJI0E4OGnkyTZnoszAzf

                  【讨论】:

                    【解决方案11】:

                    这是在 ES6 中实现相同目标的新方法:

                    function SplitByString(source, splitBy) {
                      var splitter = splitBy.split('');
                      splitter.push([source]); //Push initial value
                    
                      return splitter.reduceRight(function(accumulator, curValue) {
                        var k = [];
                        accumulator.forEach(v => k = [...k, ...v.split(curValue)]);
                        return k;
                      });
                    }
                    
                    var source = "abc,def#hijk*lmn,opq#rst*uvw,xyz";
                    var splitBy = ",*#";
                    console.log(SplitByString(source, splitBy));

                    请注意在这个函数中:

                    • 不涉及正则表达式
                    • 以与 source 中相同的顺序返回拆分值

                    以上代码的结果是:

                    【讨论】:

                    • 如果我要拆分的是“hello”和“ciao”怎么办?
                    • @BrodaNoel 根据您的需要修改splitBy.split('')。我不知道为什么SplitByString() 没有设计为立即接受一个数组作为参数,所以没有人必须猜测在哪里分割任何东西。
                    【解决方案12】:
                    a = "a=b,c:d"
                    
                    array = ['=',',',':'];
                    
                    for(i=0; i< array.length; i++){ a= a.split(array[i]).join(); }
                    

                    这将返回没有特殊字符的字符串。

                    【讨论】:

                      【解决方案13】:

                      另一种简单但有效的方法是重复使用split + join。

                      "a=b,c:d".split('=').join(',').split(':').join(',').split(',')
                      

                      本质上,先进行拆分,然后再进行连接就像全局替换,所以这会用逗号替换每个分隔符,然后一旦全部替换,它就会在逗号上进行最终拆分

                      上面表达式的结果是:

                      ['a', 'b', 'c', 'd']
                      

                      对此进行扩展,您还可以将其放在一个函数中:

                      function splitMulti(str, tokens){
                              var tempChar = tokens[0]; // We can use the first token as a temporary join character
                              for(var i = 1; i < tokens.length; i++){
                                  str = str.split(tokens[i]).join(tempChar);
                              }
                              str = str.split(tempChar);
                              return str;
                      }
                      

                      用法:

                      splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]
                      

                      如果您经常使用此功能,甚至可能值得考虑包装 String.prototype.split 为方便起见(我认为我的功能相当安全 - 唯一需要考虑的是条件的额外开销(次要)以及它缺少的事实如果传递了数组,则限制参数的实现。

                      如果使用下面的这种方法简单地包装它,请确保包含splitMulti 函数:)。另外值得注意的是,有些人不赞成扩展内置插件(因为很多人做错了并且可能发生冲突),所以如果有疑问,请在使用此插件之前与更资深的人交谈或询问 SO :)

                          var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
                          String.prototype.split = function (){
                              if(arguments[0].length > 0){
                                  if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
                                      return splitMulti(this, arguments[0]);  // Call splitMulti
                                  }
                              }
                              return splitOrig.apply(this, arguments); // Call original split maintaining context
                          };
                      

                      用法:

                      var a = "a=b,c:d";
                          a.split(['=', ',', ':']); // ["a", "b", "c", "d"]
                      
                      // Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
                              a.split('='); // ["a", "b,c:d"] 
                      

                      享受吧!

                      【讨论】:

                      • 你为什么写for(var i = 0; i &lt; tokens.length; i++)而不是for(var i = 1; i &lt; tokens.length; i++)
                      • 我错过了那个优化,你说得对,我们可以从tokens[1] 开始将一个迭代保存为tokens[0] == tempchar,然后我们在迭代tokens 后拆分tempchar 以完成。我会相应地更新答案谢谢@tic :)。
                      • 玩原型是不明智的。由于底层发生了优化,因此很难意识到开销方面的考虑。您可以在 C 中触发一个标志,上面写着“如果他们修改了原型,假设 X 不再安全,回退到这个 [慢得多] 代码路径”以用于各种功能。看起来像“低开销”的东西最终可能会使其他优化代码的执行速度减慢几个数量级。
                      • 不好,因为如果字符串中已经有一个,,你会被它分割,即使你不想要它。
                      • @BrodaNoel 你是对的,这是第一个代码示例的一个主要警告。在这种特殊情况下,最好使用可以安全拆分的字符,在我的示例中,目的是替换 ,,因此它是“安全的”,但它肯定是需要注意的。 splitMulti 示例通过使用数组中的第一个标记作为临时占位符来解决这个问题,因为我们知道我们希望所有这些都被替换,所以它总是可以安全使用:)
                      【解决方案14】:

                      让我们保持简单:(在 RegEx 中添加“[ ]+”表示“1 或多个”)

                      这意味着“+”和“{1,}”是相同的。

                      var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
                      

                      【讨论】:

                      • 末尾加“+”表示1个或多个
                      • 我会说这是最小的,不简单
                      • 对于 + 和 - :-D,也可以用 \s 代替空白字符: var words = text.split(/[\s.:;?!~,`"&| (){}\=\+\-[]\r\n/\]+/);
                      【解决方案15】:

                      对于那些希望对其拆分功能进行更多自定义的人,我编写了一个递归算法,该算法将给定的字符串与要拆分的字符列表分开。我在看到上面的帖子之前写了这个。我希望它可以帮助一些沮丧的程序员。

                      splitString = function(string, splitters) {
                          var list = [string];
                          for(var i=0, len=splitters.length; i<len; i++) {
                              traverseList(list, splitters[i], 0);
                          }
                          return flatten(list);
                      }
                      
                      traverseList = function(list, splitter, index) {
                          if(list[index]) {
                              if((list.constructor !== String) && (list[index].constructor === String))
                                  (list[index] != list[index].split(splitter)) ? list[index] = list[index].split(splitter) : null;
                              (list[index].constructor === Array) ? traverseList(list[index], splitter, 0) : null;
                              (list.constructor === Array) ? traverseList(list, splitter, index+1) : null;    
                          }
                      }
                      
                      flatten = function(arr) {
                          return arr.reduce(function(acc, val) {
                              return acc.concat(val.constructor === Array ? flatten(val) : val);
                          },[]);
                      }
                      
                      var stringToSplit = "people and_other/things";
                      var splitList = [" ", "_", "/"];
                      splitString(stringToSplit, splitList);
                      

                      以上示例返回:["people", "and", "other", "things"]

                      注意:flatten 函数取自 Rosetta Code

                      【讨论】:

                        【解决方案16】:

                        一个简单的方法是使用每个分隔符处理字符串的每个字符并构建一个拆分数组:

                        splix = function ()
                        {
                          u = [].slice.call(arguments); v = u.slice(1); u = u[0]; w = [u]; x = 0;
                        
                          for (i = 0; i < u.length; ++i)
                          {
                            for (j = 0; j < v.length; ++j)
                            {
                              if (u.slice(i, i + v[j].length) == v[j])
                              {
                                y = w[x].split(v[j]); w[x] = y[0]; w[++x] = y[1];
                              };
                            };
                          };
                          
                          return w;
                        };
                        

                        console.logg = function ()
                        {
                          document.body.innerHTML += "<br>" + [].slice.call(arguments).join();
                        }
                        
                        splix = function() {
                          u = [].slice.call(arguments);
                          v = u.slice(1);
                          u = u[0];
                          w = [u];
                          x = 0;
                          console.logg("Processing: <code>" + JSON.stringify(w) + "</code>");
                        
                          for (i = 0; i < u.length; ++i) {
                            for (j = 0; j < v.length; ++j) {
                              console.logg("Processing: <code>[\x22" + u.slice(i, i + v[j].length) + "\x22, \x22" + v[j] + "\x22]</code>");
                              if (u.slice(i, i + v[j].length) == v[j]) {
                                y = w[x].split(v[j]);
                                w[x] = y[0];
                                w[++x] = y[1];
                                console.logg("Currently processed: " + JSON.stringify(w) + "\n");
                              };
                            };
                          };
                        
                          console.logg("Return: <code>" + JSON.stringify(w) + "</code>");
                        };
                        
                        setTimeout(function() {
                          console.clear();
                          splix("1.23--4", ".", "--");
                        }, 250);
                        @import url("http://fonts.googleapis.com/css?family=Roboto");
                        
                        body {font: 20px Roboto;}

                        用法:splix(string, delimiters...)

                        示例:splix("1.23--4", ".", "--")

                        返回:["1", "23", "4"]

                        【讨论】:

                          【解决方案17】:

                          我不知道 RegEx 的性能,但这里是 RegEx 的另一种替代方案,它利用本机 HashSet 并以 O( max(str.length, delimeter.length) ) 复杂度代替:

                          var multiSplit = function(str,delimiter){
                              if (!(delimiter instanceof Array))
                                  return str.split(delimiter);
                              if (!delimiter || delimiter.length == 0)
                                  return [str];
                              var hashSet = new Set(delimiter);
                              if (hashSet.has(""))
                                  return str.split("");
                              var lastIndex = 0;
                              var result = [];
                              for(var i = 0;i<str.length;i++){
                                  if (hashSet.has(str[i])){
                                      result.push(str.substring(lastIndex,i));
                                      lastIndex = i+1;
                                  }
                              }
                              result.push(str.substring(lastIndex));
                              return result;
                          }
                          
                          multiSplit('1,2,3.4.5.6 7 8 9',[',','.',' ']);
                          // Output: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
                          
                          multiSplit('1,2,3.4.5.6 7 8 9',' ');
                          // Output: ["1,2,3.4.5.6", "7", "8", "9"]
                          

                          【讨论】:

                          • 是的,你实际测试你写的东西怎么样?jsperf.com/slice-vs-custom这表明你的代码在这个例子中实际上慢了10倍。是什么让您想到使用 2 次切片、2 次连续、1 次拆分、1 次时移和无长度缓存对性能友好?
                          • 我更新了代码,现在只有最小数量的切片,没有移位、分割等。
                          【解决方案18】:

                          嗨,例如,如果您在字符串 07:05:45PM 中拆分和替换

                          var hour = time.replace("PM", "").split(":");
                          

                          结果

                          [ '07', '05', '45' ]
                          

                          【讨论】:

                            【解决方案19】:

                            从@stephen-sweriduk 解决方案开始(这对我来说更有趣!),我稍微修改了它以使其更通用和可重用:

                            /**
                             * Adapted from: http://stackoverflow.com/questions/650022/how-do-i-split-a-string-with-multiple-separators-in-javascript
                            */
                            var StringUtils = {
                            
                              /**
                               * Flatten a list of strings
                               * http://rosettacode.org/wiki/Flatten_a_list
                               */
                              flatten : function(arr) {
                                var self=this;
                                return arr.reduce(function(acc, val) {
                                    return acc.concat(val.constructor === Array ? self.flatten(val) : val);
                                },[]);
                              },
                            
                              /**
                               * Recursively Traverse a list and apply a function to each item
                               * @param list array
                               * @param expression Expression to use in func
                               * @param func function of (item,expression) to apply expression to item
                               *
                               */
                              traverseListFunc : function(list, expression, index, func) {
                                var self=this;
                                if(list[index]) {
                                    if((list.constructor !== String) && (list[index].constructor === String))
                                        (list[index] != func(list[index], expression)) ? list[index] = func(list[index], expression) : null;
                                    (list[index].constructor === Array) ? self.traverseListFunc(list[index], expression, 0, func) : null;
                                    (list.constructor === Array) ? self.traverseListFunc(list, expression, index+1, func) : null;
                                }
                              },
                            
                              /**
                               * Recursively map function to string
                               * @param string
                               * @param expression Expression to apply to func
                               * @param function of (item, expressions[i])
                               */
                              mapFuncToString : function(string, expressions, func) {
                                var self=this;
                                var list = [string];
                                for(var i=0, len=expressions.length; i<len; i++) {
                                    self.traverseListFunc(list, expressions[i], 0, func);
                                }
                                return self.flatten(list);
                              },
                            
                              /**
                               * Split a string
                               * @param splitters Array of characters to apply the split
                               */
                              splitString : function(string, splitters) {
                                return this.mapFuncToString(string, splitters, function(item, expression) {
                                  return item.split(expression);
                                })
                              },
                            
                            }
                            

                            然后

                            var stringToSplit = "people and_other/things";
                            var splitList = [" ", "_", "/"];
                            var splittedString=StringUtils.splitString(stringToSplit, splitList);
                            console.log(splitList, stringToSplit, splittedString);
                            

                            原样返回:

                            [ ' ', '_', '/' ] 'people and_other/things' [ 'people', 'and', 'other', 'things' ]
                            

                            【讨论】:

                              【解决方案20】:

                              我认为如果您指定要留下的内容而不是要删除的内容会更容易。

                              如果你只想有英文单词,你可以这样使用:

                              text.match(/[a-z'\-]+/gi);
                              

                              示例(运行 sn-p):

                              var R=[/[a-z'\-]+/gi,/[a-z'\-\s]+/gi];
                              var s=document.getElementById('s');
                              for(var i=0;i<R.length;i++)
                               {
                                var o=document.createElement('option');
                                o.innerText=R[i]+'';
                                o.value=i;
                                s.appendChild(o);
                               }
                              var t=document.getElementById('t');
                              var r=document.getElementById('r');
                              
                              s.onchange=function()
                               {
                                r.innerHTML='';
                                var x=s.value;
                                if((x>=0)&&(x<R.length))
                                 x=t.value.match(R[x]);
                                for(i=0;i<x.length;i++)
                                 {
                                  var li=document.createElement('li');
                                  li.innerText=x[i];
                                  r.appendChild(li);
                                 }
                               }
                              <textarea id="t" style="width:70%;height:12em">even, test; spider-man
                              
                              But saying o'er what I have said before:
                              My child is yet a stranger in the world;
                              She hath not seen the change of fourteen years,
                              Let two more summers wither in their pride,
                              Ere we may think her ripe to be a bride.
                              
                              —Shakespeare, William. The Tragedy of Romeo and Juliet</textarea>
                              
                              <p><select id="s">
                               <option selected>Select a regular expression</option>
                               <!-- option value="1">/[a-z'\-]+/gi</option>
                               <option value="2">/[a-z'\-\s]+/gi</option -->
                              </select></p>
                               <ol id="r" style="display:block;width:auto;border:1px inner;overflow:scroll;height:8em;max-height:10em;"></ol>
                              </div>

                              【讨论】:

                                【解决方案21】:

                                我发现我需要这个的主要原因之一是在/\ 上拆分文件路径。这是一个有点棘手的正则表达式,所以我会在这里发布以供参考:

                                var splitFilePath = filePath.split(/[\/\\]/);
                                

                                【讨论】:

                                  【解决方案22】:

                                  我使用正则表达式:

                                  str =  'Write a program that extracts from a given text all palindromes, e.g. "ABBA", "lamal", "exe".';
                                  
                                  var strNew = str.match(/\w+/g);
                                  
                                  // Output: ["Write", "a", "program", "that", "extracts", "from", "a", "given", "text", "all", "palindromes", "e", "g", "ABBA", "lamal", "exe"]
                                  

                                  【讨论】:

                                  • 这对回文没有任何作用,只是文字。
                                  【解决方案23】:

                                  您可以将所有要用作分隔符的字符单独或集中汇总到正则表达式中,然后将它们传递给 split 函数。例如你可以写:

                                  console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );
                                  

                                  输出将是:

                                  ["dasdnk", "asd", "naks", ":d", "skldma"]
                                  

                                  【讨论】:

                                    【解决方案24】:

                                    棘手的方法:

                                    var s = "dasdnk asd, (naks) :d skldma";
                                    var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
                                    console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
                                    

                                    【讨论】:

                                    • 这是错误的,因为 .replace() 不会替换所有元素 :/
                                    • 您可以将 '(' 更改为 /(/g 以替换所有 ( 元素 - g 是 RegExp 的 global 标志 - 因此它会搜索所有出现的(不是第一个
                                    【解决方案25】:

                                    传入一个正则表达式作为参数:

                                    js> "Hello awesome, world!".split(/[\s,]+/)
                                    Hello,awesome,world!
                                    

                                    编辑添加:

                                    选择数组长度减1可以得到最后一个元素:

                                    >>> bits = "Hello awesome, world!".split(/[\s,]+/)
                                    ["Hello", "awesome", "world!"]
                                    >>> bit = bits[bits.length - 1]
                                    "world!"
                                    

                                    ...如果模式不匹配:

                                    >>> bits = "Hello awesome, world!".split(/foo/)
                                    ["Hello awesome, world!"]
                                    >>> bits[bits.length - 1]
                                    "Hello awesome, world!"
                                    

                                    【讨论】:

                                    • 你的 js 使用的是什么> 控制台?
                                    • rhino,Mozilla 在 Java 中的 JavaScript 实现:mozilla.org/rhino(...或“sudo apt-get install rhino”)。
                                    • 谢谢。与此相关的另一个问题是我需要做的是获取拆分数组的最后一个元素。如果没有数组,它应该返回字符串 thx
                                    • 用正则表达式分割时有什么办法可以避免去掉分隔符?
                                    • 如何拆分字符串“hello world”以及另一个字符(或其他正则表达式),如管道符号?尝试了(hello world)|\| 的变体,但还不太奏效。有什么想法吗?
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2012-12-27
                                    • 1970-01-01
                                    • 2012-05-10
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2021-11-10
                                    相关资源
                                    最近更新 更多