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


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.