【问题标题】:How to split string with subtotal prefix如何使用小计前缀拆分字符串
【发布时间】:2014-09-11 12:57:19
【问题描述】:

我想分割字符串

'something.somethingMore.evenMore[123].last'

['something',
'something.somethingMore',
'something.somethingMore.evenMore[123]',
'something.somethingMore.evenMore[123].last']

我想不出用分隔符“.”来分割字符串的简单解决方案,但要使用字符串的前面内容。

【问题讨论】:

    标签: javascript regex regex-group subtotal


    【解决方案1】:

    现代 JS 编程风格类似于

    str                                             //take the input
        .split('.')                                 //and split it into array of segments,
        .map(                                       //which we map into a new array,
            function(segment, index, segments)      //where for each segment
                return segments.slice(0, index+1)   //we take the segments up to its index
                    .join(".")                      //and put them back together with '.'
                ;
             }
        )
    

    这利用了Array#map 函数不仅传递当前值,还传递其索引和整个输入数组这一事实。这使我们可以轻松地使用slice 来获取一个包含当前段之前的所有段的数组。

    【讨论】:

    • 不错的解决方案。谢谢。我尝试与正则表达式匹配,但没有运气通用。
    【解决方案2】:

    我不会说我的解决方案很简单,但是:

    function splitArrayIntoGoofyArray(val){
      var str =val.split("."), arr = [];
      for (var x = str.length; x >= 1; x--){
         var cnt = str.length - x;
         arr.push((cnt > 0) ? arr[cnt - 1] + "." + str[cnt] : str[cnt]);
      }
      return arr;
    }
    console.log(splitArrayIntoGoofyArray("aaa.bbb.ccc.ddd"));
    

    http://jsfiddle.net/7tav4sue/

    【讨论】:

      【解决方案3】:

      这取决于什么是简单的解决方案。 最简单的方法是创建第一个数组

      var str = 'something.somethingMore.evenMore[123].last';
      var arr = str.split('.');
      

      然后用这个数据填充新数组

      var result = [];
      for (var i = 0; i < arr.length; i++) {
          var item = [];
          for (var j = 0; j <= i; j++) {
              item.push(arr[j]);
          }
          result.push(item.join('.'))
      }
      

      【讨论】:

        【解决方案4】:

        您可以尝试匹配而不是拆分,

        > var s = 'something.somethingMore.evenMore[123].last';
        undefined
        > var regex = /(?=(^((([^.]*)\.[^.]*)\.[^.]*)\.[^.]*))/g;
        undefined
        > regex.exec(s)
        [ '',
          'something.somethingMore.evenMore[123].last',
          'something.somethingMore.evenMore[123]',
          'something.somethingMore',
          'something',
          index: 0,
          input: 'something.somethingMore.evenMore[123].last' ]
        

        要获得所需的输出,

        > regex.exec(s).slice(1,5)
        [ 'something.somethingMore.evenMore[123].last',
          'something.somethingMore.evenMore[123]',
          'something.somethingMore',
          'something' ]
        

        【讨论】:

        • 非常聪明,虽然我不太确定它是如何工作的。
        • 这里不需要正则表达式。你可以拆分和循环
        【解决方案5】:

        我猜你需要一个循环:

        在查找“.”时字符,返回列表子字符串,直到新的“。”指数。使用找到的最后一个正确索引开始每次搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-13
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          • 2013-02-12
          • 2020-09-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多