基于重复分割字符串

7

我有一个字符串值("11112233")。我想要将这个字符串分割并分离成3个不同的值。

Val 1 = 1111
val 2 = 22    
val 3 = 33

我进行了很多搜索,发现可以使用字符 (/) 或其他符号来实现。 另外,我的数字总是不同的,所以我无法通过输入精确的字符串来拆分它。 我想要做类似于这样的操作:

var myVal = "11112233";
var lastVal = myVal.split(0 , 3); // split from index 0 till index 3

我该如何做呢?
谢谢。


只需像这样简单地编写代码:'11112233'.split(/(1+|2+|3+)/),但需要正则表达式的优化。 - Raghavendra
5个回答

14

尝试使用这个正则表达式:

'121112233'.match(/(\d)\1*/g) // ["1", "2", "111", "22", "33"]

\1* 表示“与前一个匹配项相同,零次或多次”。


4
试试这样做。
myVal='11112233'
myVal.match(/(\d)\1+/g); //["1111", "22", "33"]

3
你可以使用对象来解决这个问题。
var str = '11112233';

var strObj = {};

for(var i = 0; i < str.length; i++){
     if(strObj[str[i]]) {
         strObj[str[i]]+=str[i];
     } else {
        strObj[str[i]] = str[i];
     }
}

for (var key in strObj) {
  if (strObj.hasOwnProperty(key)) {
    alert(key + " -> " + strObj[key]);
  }
}

JsFiddle : https://jsfiddle.net/nikdtu/7qj3szo2/


它应该在时间和空间复杂度方面更有效率。 - Nikhil Maheshwari
不确定:http://jsperf.com/regexp-vs-hardcoded,就 jsperf 的可靠性而言 :-D - user1636522

2

这里有一个substr()函数。

你可以像在问题中所写的那样使用它:

var myVal = "11112233";
var lastVal = myVal.substr(0, 3); // "1111"

1
实际上,这个问题相当不清楚,因为它说“类似于这样的东西”。在我看来,这仍然是一个有效的回答。 - mik01aj

2
为了补充以上答案,这里提供一种不使用正则表达式的解决方案。
function partition(acc, value){

  var last = acc[acc.length-1];
  if(last && last[0] == value) acc[acc.length-1] += value;
  else acc = acc.concat(value);

  return acc;
}

var toInt = parseInt.bind(null, 10)

var x = ([[]]).concat("112233".split(''))
              .reduce(partition).map(toInt);

// [11, 22, 33]

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