2015-07-20 5 views
0

У меня есть строка.Разделить строку на массив со спины

var string = "31415926535897932384626433832795028841971693993751058209749445923078164"; 

Я хочу разбить его на массив длиной 10 со спины.

у меня есть:

function split(a) { 
    return a.split(/(?=(?:..........)*$)/).map(function(x){return parseInt(x)}); 
} 

, который дает мне желаемый результат, как:

[3, 1415926535, 8979323846, 2643383279, 5028841971, 6939937510, 5820974944, 5923078164] 

Вопросы:

  • Как сделать выше функция динамического, так что я может разбивать строки на n количество символов? (В настоящее время я добавляю/удаляю точки)

  • Как пропустить первый символ при расщеплении? (Я бы хотел, чтобы первый элемент всегда был 3, поэтому второй элемент может иметь длину от 1 до n)?

+1

Вместо '? ..........', 'делать:?. {10}'. –

+1

Почему бы вам перекомпилировать некоторые простые операции над строкой, разделенной индексом, на некоторое компилированное регулярное выражение? – texasbruce

+0

@texasbruce, что было бы простым способом сделать это? – WhatisSober

ответ

6

Просто укажите количество цифр, которое вы хотите получить для каждого элемента в фигурных скобках. Обратите внимание, что вы не можете передавать переменную в регулярное выражение, которое использует / как разделители. Вы должны использовать конструктор RegExp для передачи переменных в регулярном выражении.

var string = "31415926535897932384626433832795028841971693993751058209749445923078164"; 
 
function split(a,n) { 
 
    return a.split(new RegExp("(?=(?:.{" + n + "})*$)")).map(function(x){return parseInt(x)}); 
 
} 
 
alert(split(string, 10))

ИЛИ

Вы можете просто использовать спичку вместо раскола.

string.match(/(?!^.).{11}/gm) 

DEMO

var string = "31415926535897932384626433832795028841971693993751058209749445923078164"; 
 
function split(a,n) { 
 
    return a.match(new RegExp("(?!^.).{" + n + "}|^.", "gm")).map(function(x){return parseInt(x)}); 
 
} 
 
alert(split(string, 11))

Если вы хотите, чтобы соответствовать оставшимся символам, т.е. символ присутствует в начале и непарные символы существуют на последнем, вы можете используйте это регулярное выражение.

/(?!^.).{11}|^.|.+/gm 

DEMO

+1

Это прекрасно работает для меня. Отличное решение. В моем jsfiddle я завернул его в вспомогательную функцию. http://jsfiddle.net/kieranpotts/8wjszvc5/1/ – kieranpotts

+1

Идеально. Спасибо, Авинаш. Очень признателен! – WhatisSober

+0

Рад, что все получилось .. Добро пожаловать –

1

легкий way..without используя RegExp уаг строку = "31415926535897932384626433832795028841971693993751058209749445923078164"; var arr = new Array(); while (! String.length < 10) { substr = string.substr (strlen (string) -10); string = string.replace (substr, ''); arr.push (substr); } var result_arr = arr.reverse();

+0

Это PHP, а не JavaScript. Но если вы можете преобразовать это в JS @Aniket, это, вероятно, лучший ответ, поскольку он не полагается на регулярные выражения. Как вы думаете? :) – kieranpotts

+0

да, @KieranPotts, thnx ... как глупо я ..: D –

+0

Спасибо Аникет. В настоящее время jsperf недоступен. Я буду проводить тестирование производительности со всеми решениями при его резервном копировании. – WhatisSober

1

Пожалуйста, проверьте это

var _mySplit = function(str, splitLength) { 
    var _regEx = ''; 
    var startSubStringLength = str.length % splitLength 
    if(startSubStringLength > 0) { 
     _regEx = new RegExp("(^.{1," + startSubStringLength + "})|(.{1," + splitLength + "})|(.{1,})", "g") 
    } 
    return str.match(_regEx) 
} 
+0

Спасибо, Харпе. После выполнения jsperf я буду выполнять некоторые тесты производительности с регулярным выражением и без него. – WhatisSober

Смежные вопросы