JavaScript - разделите строку на строковый массив после n символов [duplicate]

Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.

Пример:

Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.

Вы можно просто избежать этого, проверив, является ли переменная не нулевой:

Person p = null;
if (p!=null)
{
    p.Name = "Harry"; // Not going to run to this point
}

Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .

Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!

Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.

Типы ссылок (эти должны быть проверены):

  • динамический
  • объект
  • string

Типы значений (вы можете просто игнорировать эти):

  • Числовые типы
  • Интегральные типы
  • Типы с плавающей запятой
  • decimal
  • bool
  • Пользовательские структуры

128
задан Ben 7 June 2011 в 01:25
поделиться

8 ответов

var str = 'abcdefghijkl';
console.log(str.match(/.{1,3}/g));

Примечание: вместо {3} используйте {1,3}, чтобы включить остаток для длин строк, которые не кратно 3, например:

console.log("abcd".match(/.{1,3}/g)); // ["abc", "d"]


Еще несколько тонкостей:

  1. Если ваша строка может содержать символы новой строки (, который вы хотите считать символом, а не разделять строку ), тогда . не будет записывать их. Вместо этого используйте /[\s\S]{1,3}/. (Спасибо @Mike).
  2. Если ваша строка пуста, то match() вернет null, когда вы можете ожидать пустой массив. Защитите это, добавив || [].

Итак, вы можете закончить:

var str = 'abcdef \t\r\nghijkl';
var parts = str.match(/[\s\S]{1,3}/g) || [];
console.log(parts);

console.log(''.match(/[\s\S]{1,3}/g) || []);

247
ответ дан Ruslan López 3 September 2018 в 13:47
поделиться

Если вы не хотели использовать регулярное выражение ...

var chunks = [];

for (var i = 0, charsLength = str.length; i < charsLength; i += 3) {
    chunks.push(str.substring(i, i + 3));
}

jsFiddle .

... в противном случае решение регулярного выражения довольно хорошо:)

29
ответ дан alex 3 September 2018 в 13:47
поделиться

Вот быстрая двухстрочная строка, которая запятнает номера:

function commafy(inVal){
    var ary = String(inVal).match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i);
    return (ary[1] == "" ? [] : [ary[1]]).splice(1, 0, ary[2].match(/[0-9]{3}/g)).join(",") + ary[3];
}

, если она была распространена, это может выглядеть так:

function commafy(inVal){
    var aryChunks = [];
    var inVal = String(inVal);
    var aryPart1 = inVal.match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i);
    if(aryPart1[1] != ""){
        aryChunks.push(aryPart1[1]);
    }
    var aryPart2 = aryPart1[2].match(/[0-9]{3}/g);
    aryChunks.splice(1, 0, aryPart2);
    var outVal = aryChunks.join(",");
    outVal += aryPart1[3];
    return outVal;
}

Сначала назначается aryPart1 с совпадением регулярных выражений, состоящим из [от 0 до 2 чисел], за которым следует [строка символов, длина которых кратная 3], а затем [ноль или один незнатный и все остальное].

Тогда, если это не "", мы добавляем [0 to 2 numbers] к aryChunks.

После этого мы берем [строку символов, длина которых кратно 3], а регулярное выражение сопоставляет их в массив из [3-символьных фрагментов], называемый aryPart2, который мы затем соединяем с aryChunks.

Теперь aryChunks содержит куски, которые мы присоединяем к запятой и присваиваем outVal.

Все, что осталось сделать, это добавить [нуль или одну цифру и все остальное] в outVal и return outVal для вызывающего абонента.

Для OP, {0,2} и {3} в регулярном выражении 1 и {3} в регулярном выражении 2 могут быть переменными, чтобы сделать куски любой длины , а \ d в регулярных выражениях можно изменить на "." если вы хотите, чтобы он работал больше, чем просто цифры.

Я слишком долго писал это, так что может быть несколько сбоев. Направьте их, и я подстрою их.

0
ответ дан alfadog67 3 September 2018 в 13:47
поделиться
function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}

Выше функция - это то, что я использую для Chunking Base64. Он создаст разрыв строки, когда будет 75 символов.

1
ответ дан Dave Brown 3 September 2018 в 13:47
поделиться

Мое решение (синтаксис ES6):

const source = "8d7f66a9273fc766cd66d1d";
const target = [];
for (
    const array = Array.from(source);
    array.length;
    target.push(array.splice(0,2).join(''), 2));

Мы могли бы даже создать функцию с этим:

function splitStringBySegmentLength(source, segmentLength) {
    if (!segmentLength || segmentLength < 1) throw Error('Segment length must be defined and greater than/equal to 1');
    const target = [];
    for (
        const array = Array.from(source);
        array.length;
        target.push(array.splice(0,segmentLength).join('')));
    return target;
}

Затем вы можете легко вызвать функцию в многоразовом режиме :

const source = "8d7f66a9273fc766cd66d1d";
const target = splitStringBySegmentLength(source, 2);

Приветствия

1
ответ дан Jesus Gonzalez 3 September 2018 в 13:47
поделиться

Некоторое чистое решение без использования регулярных выражений:

/**
* Create array with maximum chunk length = maxPartSize
* It work safe also for shorter strings than part size
**/
function convertStringToArray(str, maxPartSize){

  const chunkArr = [];
  let leftStr = str;
  do {

    chunkArr.push(leftStr.substring(0, maxPartSize));
    leftStr = leftStr.substring(maxPartSize, leftStr.length);

  } while (leftStr.length > 0);

  return chunkArr;
};

Пример использования - https://jsfiddle.net/maciejsikora/b6xppj4q/ .

] Я также попытался сравнить свое решение с регулярным выражением, которое было выбрано в качестве правильного ответа. Некоторые тесты можно найти на jsfiddle - https://jsfiddle.net/maciejsikora/2envahrk/ . Тесты показывают, что оба метода имеют схожую производительность, возможно, первое решение regexp немного быстрее, но судите сами.

0
ответ дан Maciej Sikora 3 September 2018 в 13:47
поделиться
str.match(/.{3}/g); // => ['abc', 'def', 'ghi', 'jkl']
18
ответ дан maerics 3 September 2018 в 13:47
поделиться

Основываясь на предыдущих ответах на этот вопрос; следующая функция будет разделять строку (str) n-number (size) символов.

function chunk(str, size) {
    return str.match(new RegExp('.{1,' + size + '}', 'g'));
}

Демо

(function() {
  function chunk(str, size) {
    return str.match(new RegExp('.{1,' + size + '}', 'g'));
  }
  
  var str = 'HELLO WORLD';
  println('Simple binary representation:');
  println(chunk(textToBin(str), 8).join('\n'));
  println('\nNow for something crazy:');
  println(chunk(textToHex(str, 4), 8).map(function(h) { return '0x' + h }).join('  '));
  
  // Utiliy functions, you can ignore these.
  function textToBin(text) { return textToBase(text, 2, 8); }
  function textToHex(t, w) { return pad(textToBase(t,16,2), roundUp(t.length, w)*2, '00'); }
  function pad(val, len, chr) { return (repeat(chr, len) + val).slice(-len); }
  function print(text) { document.getElementById('out').innerHTML += (text || ''); }
  function println(text) { print((text || '') + '\n'); }
  function repeat(chr, n) { return new Array(n + 1).join(chr); }
  function textToBase(text, radix, n) {
    return text.split('').reduce(function(result, chr) {
      return result + pad(chr.charCodeAt(0).toString(radix), n, '0');
    }, '');
  }
  function roundUp(numToRound, multiple) { 
    if (multiple === 0) return numToRound;
    var remainder = numToRound % multiple;
    return remainder === 0 ? numToRound : numToRound + multiple - remainder;
  }
}());
#out {
  white-space: pre;
  font-size: 0.8em;
}
<div id="out"></div>

8
ответ дан Mr. Polywhirl 3 September 2018 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: