আমি কীভাবে এন অক্ষরের অংশগুলিতে একটি স্ট্রিংকে বিভক্ত করতে পারি?


200

শিরোনাম হিসাবে, আমি একটি স্ট্রিং পেয়েছি এবং আমি এন অক্ষরের বিভাগে বিভক্ত করতে চাই ।

উদাহরণ স্বরূপ:

var str = 'abcdefghijkl';

কিছু জাদু পরে n=3, এটি হয়ে যাবে

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

এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


358

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) || []);


এটি টেকনিক্যালি আরও ভাল উত্তর কারণ এটি 3 টি দ্বারা সমানভাবে বিভাজ্য নয় এমন স্ট্রিং থেকে সমস্ত পাঠ্যকে ধরে ফেলবে (এটি শেষ 2 বা 1 টি অক্ষর গ্রহণ করবে)।
এরিক

6
[\s\S]পরিবর্তে .যাতে নতুন লাইনে ব্যর্থ না হয় ব্যবহার করুন ।
মাইক স্যামুয়েল

2
আপনি প্রতিটি লাইনে একটি নতুন চক্র শুরু করতে চাইতে পারেন। আপনার যদি সত্যিই নতুন লাইন থাকে তবে তারা সম্ভবত কোনও ধরণের স্থানান্তর নির্দেশ করে। str.match (/। {1,3 g / gm) আরও ভাল পছন্দ হতে পারে।
কেনেবেক

+1 যত্নশীল: ''.match(/.{1,3}/g) এবং খালি অ্যারের পরিবর্তে ''.match(/.{3}/g)ফিরে nullআসুন।
ওয়েব_ ডিজাইনার

4
3 নম্বরের জায়গায় পরিবর্তনশীল থাকা সম্ভব?
আনা ক্লোদিয়া

46

আপনি যদি নিয়মিত প্রকাশটি ব্যবহার করতে না চান ...

var chunks = [];

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

jsFizz

... নাহলে রেইগেক্স সমাধানটি বেশ ভাল :)


1
ওপেনের 3পরামর্শ অনুসারে চলকটি যদি +1 হয় তবে আমি এটিকে পছন্দ করব । এটি একটি রেজিএক্সপ্রেস স্ট্রিংকে যুক্ত করার চেয়ে বেশি পঠনযোগ্য।
ডেভিড টাং

যদি আপনি কেবল এটি ব্যবহার করতে প্রস্তুত একটি কার্যকর ফাংশনে
আবদ্ধ

1
এটি রেজেক্স বিকল্পের চেয়ে 10x এরও বেশি দ্রুত, সুতরাং আমি এই (ফাংশনের অভ্যন্তরে) দিয়ে যাব jsbench.github.io/#9cb819bf1ce429575f8535a211f72d5a
চাকরী

1
আমার পূর্ববর্তী বিবৃতিটি ক্রোমিয়ামের সাথে প্রযোজ্য (এছাড়াও, পূর্ববর্তী মন্তব্যটি সম্পাদনা করতে আমি খুব দেরি করেছিলাম তাই নতুনটি লিখেছিলাম)। ফায়ারফক্সে বর্তমানে এটি আমার মেশিনে 30% দ্রুত "কেবল" তবে এটি এখনও ধারাবাহিকভাবে আরও ভাল।
চাকরী

এই স্ট্রিং বিশাল দৈর্ঘ্যের উপর স্থায়ী কি?
জ্যাকব স্নাইডার

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

এই জন্য কাজ করে 3আমাকে কিন্তু আয় জন্য nullসঙ্গে 250। 🤔
জিম

9

এই প্রশ্নের পূর্ববর্তী উত্তরগুলির উপর বিল্ডিং; নিম্নলিখিত ফাংশনটি অক্ষরের একটি স্ট্রিং ( str) এন-সংখ্যা ( 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>


2

আমার সমাধান (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);

চিয়ার্স


2
const chunkStr = (str, n, acc) => {     
    if (str.length === 0) {
        return acc
    } else {
        acc.push(str.substring(0, n));
        return chunkStr(str.substring(n), n, acc);
    }
}
const str = 'abcdefghijkl';
const splittedString = chunkStr(str, 3, []);

আরইজিএক্স ছাড়াই পরিষ্কার সমাধান


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

উপরের ফাংশনটি হ'ল আমি বেস 64 চুনকিংয়ের জন্য যা ব্যবহার করি। এটি 75৫ টি অক্ষর তৈরি করবে।


করতে পারে replace(/.{1,75}/g, '$&\n')
অ্যালেক্স

1

এখানে আমরা প্রতিটি স্ট্রিংয়ের সাথে প্রতিটি স্ট্রিংকে ছেদ করি:

export const intersperseString = (n: number, intersperseWith: string, str: string): string => {

  let ret = str.slice(0,n), remaining = str;

  while (remaining) {
    let v = remaining.slice(0, n);
    remaining = remaining.slice(v.length);
    ret += intersperseWith + v;
  }

  return ret;

};

যদি আমরা উপরেরটি এর মতো ব্যবহার করি:

console.log(splitString(3,'|', 'aagaegeage'));

আমরা পেতে:

আগ | আগ | AEG | eag | ই

এবং এখানে আমরা একই কাজ করি তবে একটি অ্যারেতে চাপ দিন:

export const sperseString = (n: number, str: string): Array<string> => {

  let ret = [], remaining = str;

  while (remaining) {
    let v = remaining.slice(0, n);
    remaining = remaining.slice(v.length);
    ret.push(v);
  }

  return ret;

};

এবং তারপরে এটি চালান:

console.log(sperseString(5, 'foobarbaztruck'));

আমরা পেতে:

['ফুবা', 'আরবাট', 'রাক']

যদি কেউ উপরের কোডটি সহজ করার কোনও উপায় জানেন, এলএমকে, তবে এটি স্ট্রিংয়ের জন্য ভাল কাজ করা উচিত।


আপনার প্রথম স্নিপেট প্রত্যাশার মতো কাজ করছে না। আমি এখানে পরিবর্তন করেছি: jsfiddle.net/omarojo/ksvx2txb/261
omarojo

0

নিয়মিত প্রকাশগুলি ব্যবহার না করেই কিছু পরিষ্কার সমাধান:

/**
* 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/ এ পাওয়া যাবে । পরীক্ষাগুলি দেখিয়ে দিচ্ছে যে উভয় পদ্ধতিরই পারফরম্যান্স রয়েছে, সম্ভবত প্রথম দেখায় রেজিএক্সপ সলিউশনটি কিছুটা দ্রুত হয় তবে আপনি নিজে বিচার করুন।


0

সাথে .split:

var arr = str.split( /(?<=^(?:.{3})+)(?!$)/ )  // [ 'abc', 'def', 'ghi', 'jkl' ]

এবং .replaceহবে:

var replaced = str.replace( /(?<=^(.{3})+)(?!$)/g, ' || ' )  // 'abc || def || ghi || jkl'



/(?!$)/শেষ হওয়ার আগে থামতে হয় /$/, ছাড়া হয়:

var arr      = str.split( /(?<=^(?:.{3})+)/ )        // [ 'abc', 'def', 'ghi', 'jkl' ]     // I don't know why is not [ 'abc', 'def', 'ghi', 'jkl' , '' ], comment?
var replaced = str.replace( /(?<=^(.{3})+)/g, ' || ')  // 'abc || def || ghi || jkl || '

গোষ্ঠী উপেক্ষা /(?:... এর )/দরকার নেই .replaceতবে .splitগোষ্ঠীগুলিকে যুক্ত করতে যোগ করা হচ্ছে:

var arr = str.split( /(?<=^(.{3})+)(?!$)/ )  // [ 'abc', 'abc', 'def', 'abc', 'ghi', 'abc', 'jkl' ]

0

এটি নিয়মিত প্রকাশ বা স্পষ্ট লুপ ছাড়া এটি করার একটি উপায়, যদিও এটি একটি লাইনারের সংজ্ঞাটি কিছুটা প্রসারিত করে:

const input = 'abcdefghijlkm';

// Change `3` to the desired split length.
const output = input.split('').reduce((s, c) => {let l = s.length-1; (s[l] && s[l].length < 3) ? s[l] += c : s.push(c); return s;}, []);

console.log(output);  // output: [ 'abc', 'def', 'ghi', 'jlk', 'm' ]

এটি স্ট্রিংকে স্বতন্ত্র অক্ষরের অ্যারেতে বিভক্ত Array.reduceকরে প্রতিটি অক্ষরের উপরে পুনরাবৃত্তি করে কাজ করে। সাধারণত reduceএকটি একক মান ফেরত দেয়, তবে এক্ষেত্রে একক মানটি একটি অ্যারে হিসাবে ঘটে এবং আমরা প্রতিটি অক্ষরের উপর দিয়ে যাওয়ার সাথে সাথে আমরা এটিকে অ্যারের শেষ আইটেমের সাথে যুক্ত করি। অ্যারেতে থাকা শেষ আইটেমটি লক্ষ্য দৈর্ঘ্যে পৌঁছে গেলে আমরা একটি নতুন অ্যারে আইটেম যুক্ত করি।


0

আলোচনার পরে একটু পরে আসছি তবে এখানে একটি ভিন্নতা যা স্ট্রিং + অ্যারে পুশের চেয়ে কিছুটা দ্রুত।

// substring + array push + end precalc
var chunks = [];

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

লুপের অংশ হিসাবে শেষের মানটি প্রাক-গণনা করা স্ট্রিংয়ের অভ্যন্তরে ইনলাইন গণিত করার চেয়ে দ্রুত। আমি এটি ফায়ারফক্স এবং ক্রোম উভয়তেই পরীক্ষা করেছি এবং তারা উভয়ই গতি দেখায়।

আপনি এটি এখানে চেষ্টা করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.