javascript اكواد - طريقة جافا سكريبت الأنيقة لتقسيم السلسلة إلى مقاطع طويلة





بالعربي مميزات (8)


الحل الخاص بي (بناء جملة 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);

في صحتك

كما يقول العنوان ، لقد حصلت على سلسلة ، وأريد أن انقسم إلى شرائح طويلة ن الأحرف.

فمثلا:

var str = 'abcdefghijkl';

بعد بعض السحر مع ن = 3 ، سوف تصبح

var arr = ['abc','def','ghi','jkl'];

هل هناك طريقة أنيقة للقيام بذلك؟




إذا كنت لا تريد استخدام تعبير عادي ...

var chunks = [];

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

jsFiddle .

... وإلا فإن حل regex جيد جدًا :)




str.match(/.{3}/g); // => ['abc', 'def', 'ghi', 'jkl']



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

ملاحظة: استخدم {1,3} بدلاً من {3} فقط لتضمين الباقي لأطوال السلسلة التي ليست مضاعفات 3 ، على سبيل المثال:

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

زوجان أكثر دقة:

  1. إذا كانت السلسلة الخاصة بك قد تحتوي على خطوط جديدة ( والتي تريد أن تعد كحرف بدلاً من تقسيم السلسلة ) ، فإن . لن يلتقطها استخدم /[\s\S]{1,3}/ بدلاً من ذلك. (شكرا @ مايك).
  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) || []);




بعض الحلول النظيفة دون استخدام تعبيرات عادية:

/**
* 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 أسرع قليلاً ، لكن احكمها بنفسك.




وإليك بطريقتين سريعتين ترتبطان بالأرقام:

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 مع تطابق regex يتكون من [0 إلى 2 أرقام] ، متبوعاً بـ [سلسلة الأحرف التي يكون طولها مضاعفات 3] ، ثم [صفر أو واحد غير رقم وكل شيء آخر].

ثم ، إذا لم يكن "" ، فإننا نلحق [0 إلى 2 أرقام] بـ aryChunks.

بعد ذلك ، نأخذ [سلسلة الأحرف التي يبلغ طولها 3 مضاعفات] ويطابقها regex في صفيف من [3 أحرف] تسمى aryPart2 ، والتي نقطعها إلى aryChunks.

الآن aryChunks يحتوي على قطع أننا سوف ينضم مع فاصلة وتعيين ل outVal.

كل ما تبقى للقيام به هو إلحاق [صفر أو واحد غير رقم وكل شيء آخر] إلى outVal ، والعودة outVal إلى المتصل.

وفقًا لـ OP ، يمكن أن يكون {0،2} و {3} في regex 1 و {3} في regex 2 متغيرات لجعل طول أي مقطع ، ويمكن تغيير \ d في regexes إلى "." إذا كنت تريد أن تعمل على أكثر من مجرد أرقام.

قضيت وقتًا طويلاً في كتابة هذا ، لذا قد يكون هناك بعض الأخطاء. أشر إلىهم وسأضطر إلى التعديل.




function chunk(er){
return er.match(/.{1,75}/g).join('\n');
}

الوظيفة أعلاه هي ما أستخدمه في تجميع Base64. سوف يخلق فاصل سطر من أي وقت مضى 75 حرفا.




الحل المحتمل باستخدام Boost قد يكون:

#include <boost/algorithm/string.hpp>
std::vector<std::string> strs;
boost::split(strs, "string to split", boost::is_any_of("\t "));

قد يكون هذا النهج أسرع من نهج stringstream . وبما أن هذه هي وظيفة قالب عام ، يمكن استخدامها لتقسيم أنواع أخرى من السلاسل (wchar ، إلخ. أو UTF-8) باستخدام جميع أنواع المحددات.

انظر documentation لمزيد من التفاصيل.





javascript arrays string split