2015-09-02 3 views
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 

Как я могу это сделать?
Благодаря

+0

просто вы можете сделать это как '11112233'.split (/ (1+ | 2+ | 3 +) /). но нуждаются в улучшениях регулярных выражений. – Raghavendra

ответ

15

Попробуйте это регулярное выражение:

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

\1* означает "те же, что и предыдущий матч, ноль или более раз".

2

Функция substr().

Вы можете использовать его как вы написали в вашем вопросе:

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

Собственно, вопрос довольно неясен, говоря «что-то вроде этого». Это по-прежнему действительный ответ imho. – mik01aj

+0

Он тоже работает. Благодарю. – Mehran

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/

+0

Спасибо. Он тоже работает. – Mehran

+0

он должен быть более эффективным с точки зрения сложности времени и пространства. –

+0

Не уверен: http://jsperf.com/regexp-vs-hardcoded, насколько jsperf надежный: -D – leaf

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] 
Смежные вопросы