জাভাস্ক্রিপ্ট এবং রেজেক্স: বিভক্ত স্ট্রিং এবং বিভাজক রাখুন


131

আমার একটি স্ট্রিং রয়েছে:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc"

এবং আমি এই স্ট্রিংটি <br />একটি বিশেষ চরিত্রের পরে ডিলিমিটার দিয়ে বিভক্ত করতে চাই ।

এটি করতে, আমি এটি ব্যবহার করছি:

string.split(/<br \/>&#?[a-zA-Z0-9]+;/g);

আমার যা প্রয়োজন তা পাচ্ছি, আমি বাদে হ্রাস করছি losing এখানে উদাহরণ: http://jsfiddle.net/JwrZ6/1/

আমি কীভাবে ডিলিমিটার রাখতে পারি?


আপনি যদি আগেই ডিলিমিটারটি জানেন তবে শুধু কেন করবেন না ... var delim = "<br/>";?
— আন্দ্রেস ওয়াং

আপনাকে @ সিগ্যান্টেং ধন্যবাদ, আমি আগেই ডিলিমিটারটি জানি তবে আমি এটি আমার উদাহরণের জন্য কাজ করতে পারি না। আমার ডেলিফিটরটি বিশেষ চরিত্রের অনুসারে রাখতে হবে <br /> কারণ আমার মাঝে মাঝে একটি বিশেষ চরটি অনুসরণ করে একটি <br /> নাও থাকতে পারে এবং এটিকে বিভাজন করতে হবে না।
— মিলিও

2
ভাল প্রশ্ন, আমার একটি অনুরূপ কেস আছে যেখানে ডিলিমিটার জেনেও কোনও লাভ হয় না। আমি "] এবং [" এ ভাগ করছি। সুতরাং সত্যই আমার ডিলিমিটারটি "&" তবে এর উপর বিভাজন যথেষ্ট সুনির্দিষ্ট নয়, সঠিক বিভাজন নির্ধারণ করতে আমার উভয় পক্ষেই বন্ধনী নেওয়া দরকার। যাইহোক, আমার স্প্লিট স্ট্রিংগুলিতে আমার আবার সেই বন্ধনীগুলি দরকার। উভয় পক্ষের 1 টি।
— পান্ডাউড

উত্তর:


104

(ইতিবাচক) চেহারাটি ব্যবহার করুন যাতে নিয়মিত অভিব্যক্তিটি দাবি করে যে বিশেষ চরিত্রের উপস্থিতি রয়েছে তবে এটি আসলে এটির সাথে মেলে না:

string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g);

এটি কর্মে দেখুন:

var string = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc";
console.log(string.split(/<br \/>(?=&#?[a-zA-Z0-9]+;)/g));


আমি যখন এই কোডটি ব্যবহার করি, তখন 0প্রতিটি স্ট্রিংয়ের শেষে এটি যুক্ত হয়
— কীবোর্ড-যোদ্ধা

2
আপনার দেওয়া লিঙ্কটিতে আমি ইতিবাচক চেহারা সম্পর্কে কিছুই খুঁজে পাচ্ছি না।
— পল ক্রিস জোন্স

@ পল জোনস সামগ্রীটি মধ্যবর্তী সময়ে সরানো হয়েছিল। আমাকে জানানোর জন্য ধন্যবাদ, আমি লিঙ্কটি স্থির করেছি।
— জন

179

আমার একই রকম তবে সামান্য ভিন্ন সমস্যা ছিল। যাইহোক, এখানে বিভেদককে কোথায় রাখা যায় তার জন্য তিনটি পৃথক দৃশ্যের উদাহরণ রয়েছে।

"1、2、3".split("、") == ["1", "2", "3"]
"1、2、3".split(/(、)/g) == ["1", "、", "2", "、", "3"]
"1、2、3".split(/(?=、)/g) == ["1", "、2", "、3"]
"1、2、3".split(/(?!、)/g) == ["1、", "2、", "3"]
"1、2、3".split(/(.*?、)/g) == ["", "1、", "", "2、", "3"]

সতর্কতা: চতুর্থটি কেবল একক অক্ষরগুলিকে বিভক্ত করতে কাজ করবে। কানারফ্যান একটি বিকল্প উপস্থাপন করে :

// Split a path, but keep the slashes that follow directories
var str = 'Animation/rawr/javascript.js';
var tokens = str.match(/[^\/]+\/?|\//g);

3
আমি তৃতীয় উদাহরণের মতো কিছু সন্ধান করছিলাম, তবে এটি কেবল তখনই কাজ করে যদি উপাদানগুলি কেবলমাত্র একটি চরিত্রের হয় - অন্যথায় এটি পৃথক অক্ষরে বিভক্ত হবে। শেষ অবধি আমাকে ক্লান্তিকর RegExp.exec রুটে যেতে হয়েছিল ।
— গর্ডন

2
প্রত্যেকে কেন / জি ব্যবহার করছে তা আমি বুঝতে পারছি না
— সার্সাপরিলা

1
কীভাবে এই রেজেক্সটি "1、2、3" .স্প্লিট (/ (?! 、) / ছ) == ["1 1 、", "2 、", "3"] পূর্ণ শব্দের জন্য ব্যবহার করবেন? উদাহরণস্বরূপ "foo1, foo2, foo3,"
— ওয়াল্টারি

তুমি একজন প্রতিভাবান!. আপনি যেখানে ডকুমেন্টেশন খুঁজে পান যেখানে এটি কাজ করে তার ব্যাখ্যা করে? আপনি প্রয়োজন নেই gএকটি শেষ
— pery mimon

1
.matchএই উদাহরণগুলির জন্য অ-লোভী সমাধানটির অনুবাদ : "11、22、33".match(/.*?、|.+$/g)-> ["11、", "22、", "33"]। নোট /gসংশোধক ম্যাচের জন্য গুরুত্বপূর্ণ।
— বেনি চেরনিয়াভস্কি-পাসকিন 13

57

আপনি যদি সীমানাটি প্যারান্থেসিতে মুড়ে রাখেন তবে এটি ফিরে আসা অ্যারের অংশ হবে।

string.split(/(<br \/>&#?[a-zA-Z0-9]+);/g);
// returns ["aaaaaa", "<br />&dagger;", "bbbb", "<br />&Dagger;", "cccc"]

কোন অংশের সাথে আপনি মিলছেন তা পরিবর্তন রাখতে চান তার উপর নির্ভরশীল

string.split(/(<br \/>)&#?[a-zA-Z0-9]+;/g);
// returns ["aaaaaa", "<br />", "bbbb", "<br />", "cccc"]

আপনি অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষর প্রকাশের দ্বারা অভিব্যক্তিটির উন্নতি করতে পারে sp (a)

এবং আপনি এর মতো পূর্বনির্ধারিত গোষ্ঠীর সাথে মিল করতে পারেন: \dসমান [0-9]এবং \wসমান [a-zA-Z0-9_]। এর অর্থ আপনার অভিব্যক্তিটি এটি দেখতে পারা যায়।

string.split(/<br \/>(&#?[a-z\d]+;)/gi);

জাভাস্ক্রিপ্টকিটে একটি ভাল নিয়মিত এক্সপ্রেশন রেফারেন্স রয়েছে ।


4
আরও ভাল, আমি জানি না যে আমরা ডিলিমিটারের কেবল একটি অংশ রাখতে পারি। আসলে আমার কেবল বিশেষ চর রাখা দরকার, আমি এটি দিয়ে এটি করতে পারি: স্ট্রিং.স্প্লিট (/ <br \/> (& #? [A-zA-Z0-9] +;) / g);
— মিলো

1
শব্দের ক্ষেত্রে উপেক্ষা করে আপনি আপনার অভিব্যক্তিটি অনুকূল করতে পারেন। বা একটি পূর্বনির্ধারিত চরিত্র শ্রেণীর জন্য মেলে। আমি আমার উত্তর আপডেট করব।
— টর্স্টেন ওয়াল্টার

2
এটি এত কম কেন .. এটি নিখুঁত এবং এত নমনীয়
— তোফান্ডেল

2
এটি অবশ্যই সহজতম উপায় এবং সর্বাধিক পঠনযোগ্য সিনট্যাক্স।
— তিমার ইভো বাটিস

4

এটির উত্তর এখানেও জাভাস্ক্রিপ্ট বিভক্ত করুন নিয়মিত এক্সপ্রেশন সীমানাটি রাখে

রেজেক্স উদাহরণে (? = প্যাটার্ন) লুক হেড প্যাটার্ন ব্যবহার করুন

var string = '500x500-11*90~1+1';
string = string.replace(/(?=[$-/:-?{-~!"^_`\[\]])/gi, ",");
string = string.split(",");

এটি আপনাকে নিম্নলিখিত ফলাফল দেবে।

[ '500x500', '-11', '*90', '~1', '+1' ]

সরাসরি বিভক্তও হতে পারে

string = string.split(/(?=[$-/:-?{-~!"^_`\[\]])/gi);

একই ফলাফল প্রদান

[ '500x500', '-11', '*90', '~1', '+1' ]

কেন ঠিক তত্ক্ষণাত্ বিভক্ত হবেন না, যেমন জনের গৃহীত উত্তরে?
— গর্ডন

@Gordon ... :) আমি শুধু যে কাজ করতে পারে ... আপডেট কোড ... চিয়ার্স
— ভেজে

2

আমি জিচির উত্তরে একটি পরিবর্তন করেছি এবং এটিকে একটি ফাংশনে রেখেছি যা একাধিক অক্ষরকে সমর্থন করে।

String.prototype.splitAndKeep = function(separator, method='seperate'){
    var str = this;
    if(method == 'seperate'){
        str = str.split(new RegExp(`(${separator})`, 'g'));
    }else if(method == 'infront'){
        str = str.split(new RegExp(`(?=${separator})`, 'g'));
    }else if(method == 'behind'){
        str = str.split(new RegExp(`(.*?${separator})`, 'g'));
        str = str.filter(function(el){return el !== "";});
    }
    return str;
};

জিচি এর উত্তর 3 য় পদ্ধতি এই ফাংশনে কাজ করবে না, তাই আমি 4 র্থ পদ্ধতিটি গ্রহণ করেছি এবং একই ফলাফল পেতে খালি স্থানগুলি সরিয়েছি।

সম্পাদনা করুন: দ্বিতীয় পদ্ধতি যা চার্জ বা চার্ট বিভক্ত করতে অ্যারে ব্যতীত

String.prototype.splitAndKeep = function(separator, method='seperate'){
    var str = this;
    function splitAndKeep(str, separator, method='seperate'){
        if(method == 'seperate'){
            str = str.split(new RegExp(`(${separator})`, 'g'));
        }else if(method == 'infront'){
            str = str.split(new RegExp(`(?=${separator})`, 'g'));
        }else if(method == 'behind'){
            str = str.split(new RegExp(`(.*?${separator})`, 'g'));
            str = str.filter(function(el){return el !== "";});
        }
        return str;
    }
    if(Array.isArray(separator)){
        var parts = splitAndKeep(str, separator[0], method);
        for(var i = 1; i < separator.length; i++){
            var partsTemp = parts;
            parts = [];
            for(var p = 0; p < partsTemp.length; p++){
                parts = parts.concat(splitAndKeep(partsTemp[p], separator[i], method));
            }
        }
        return parts;
    }else{
        return splitAndKeep(str, separator, method);
    }
};

ব্যবহার:

str = "first1-second2-third3-last";

str.splitAndKeep(["1", "2", "3"]) == ["first", "1", "-second", "2", "-third", "3", "-last"];

str.splitAndKeep("-") == ["first1", "-", "second2", "-", "third3", "-", "last"];

1

একটি এক্সটেনশন ফাংশন স্ট্রিং বা রেজিএক্স সহ স্ট্রিং বিভক্ত হয় এবং ডিলিমেটারটি সামনে বা পিছনে দ্বিতীয় প্যারামিটার অনুসারে স্থাপন করা হয়।

    String.prototype.splitKeep = function (splitter, ahead) {
        var self = this;
        var result = [];
        if (splitter != '') {
            var matches = [];
            // Getting mached value and its index
            var replaceName = splitter instanceof RegExp ? "replace" : "replaceAll";
            var r = self[replaceName](splitter, function (m, i, e) {
                matches.push({ value: m, index: i });
                return getSubst(m);
            });
            // Finds split substrings
            var lastIndex = 0;
            for (var i = 0; i < matches.length; i++) {
                var m = matches[i];
                var nextIndex = ahead == true ? m.index : m.index + m.value.length;
                if (nextIndex != lastIndex) {
                    var part = self.substring(lastIndex, nextIndex);
                    result.push(part);
                    lastIndex = nextIndex;
                }
            };
            if (lastIndex < self.length) {
                var part = self.substring(lastIndex, self.length);
                result.push(part);
            };
            // Substitution of matched string
            function getSubst(value) {
                var substChar = value[0] == '0' ? '1' : '0';
                var subst = '';
                for (var i = 0; i < value.length; i++) {
                    subst += substChar;
                }
                return subst;
            };
        }
        else {
            result.add(self);
        };
        return result;
    };

পরীক্ষা:

    test('splitKeep', function () {
        // String
        deepEqual("1231451".splitKeep('1'), ["1", "231", "451"]);
        deepEqual("123145".splitKeep('1', true), ["123", "145"]);
        deepEqual("1231451".splitKeep('1', true), ["123", "145", "1"]);
        deepEqual("hello man how are you!".splitKeep(' '), ["hello ", "man ", "how ", "are ", "you!"]);
        deepEqual("hello man how are you!".splitKeep(' ', true), ["hello", " man", " how", " are", " you!"]);
        // Regex
        deepEqual("mhellommhellommmhello".splitKeep(/m+/g), ["m", "hellomm", "hellommm", "hello"]);
        deepEqual("mhellommhellommmhello".splitKeep(/m+/g, true), ["mhello", "mmhello", "mmmhello"]);
    });

0

আমি এটি ব্যবহার করে যাচ্ছি:

String.prototype.splitBy = function (delimiter) {
  var 
    delimiterPATTERN = '(' + delimiter + ')', 
    delimiterRE = new RegExp(delimiterPATTERN, 'g');

  return this.split(delimiterRE).reduce((chunks, item) => {
    if (item.match(delimiterRE)){
      chunks.push(item)
    } else {
      chunks[chunks.length - 1] += item
    };
    return chunks
  }, [])
}

আপনার সাথে জগাখিচু করা উচিত নয় String.prototype, সুতরাং এখানে একটি ফাংশন সংস্করণ রয়েছে:

var splitBy = function (text, delimiter) {
  var 
    delimiterPATTERN = '(' + delimiter + ')', 
    delimiterRE = new RegExp(delimiterPATTERN, 'g');

  return text.split(delimiterRE).reduce(function(chunks, item){
    if (item.match(delimiterRE)){
      chunks.push(item)
    } else {
      chunks[chunks.length - 1] += item
    };
    return chunks
  }, [])
}

সুতরাং আপনি করতে পারেন:

var haystack = "aaaaaa<br />&dagger; bbbb<br />&Dagger; cccc"
var needle =  '<br \/>&#?[a-zA-Z0-9]+;';
var result = splitBy(haystack , needle)
console.log( JSON.stringify( result, null, 2) )

এবং আপনি এখানে দিয়ে শেষ করবেন:

[
  "<br />&dagger; bbbb",
  "<br />&Dagger; cccc"
]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.