জাভাস্ক্রিপ্ট: একটি স্ট্রিংয়ে পাঠ্যের শেষ উপস্থিতিকে প্রতিস্থাপন করুন


101

আমার কোড স্নিপেট নীচে দেখুন:

var list = ['one', 'two', 'three', 'four'];
var str = 'one two, one three, one four, one';
for ( var i = 0; i < list.length; i++)
{
     if (str.endsWith(list[i])
     {
         str = str.replace(list[i], 'finish')
     }
 }

আমি স্ট্রিংয়ে ফিনিস শব্দের সাথে শব্দের একটির শেষ ঘটনাটি প্রতিস্থাপন করতে চাই, যা আমার আছে তা কাজ করবে না কারণ প্রতিস্থাপন পদ্ধতিটি কেবল এটির প্রথম উপস্থিতিটি প্রতিস্থাপন করবে। কেউ কি জানেন যে আমি কীভাবে সেই স্নিপেটটি সংশোধন করতে পারি যাতে এটি কেবল 'এক' এর শেষ উদাহরণটি প্রতিস্থাপন করে

উত্তর:


117

ঠিক আছে, যদি স্ট্রিংটি সত্যই প্যাটার্ন দিয়ে শেষ হয় তবে আপনি এটি করতে পারেন:

str = str.replace(new RegExp(list[i] + '$'), 'finish');

4
ভাল ধারণা. প্রথমে সেই স্ট্রিংটি পালাতে হবে (যদিও তার নমুনা ডেটার সাথে নয়, মঞ্জুর করা হয়েছে), যা তুচ্ছ নয়। :-(
টিজে ক্রাউডার

@ রুথ কোন সমস্যা নেই! @ টিজে হ্যাঁ, সত্যই এটি সত্য: রুথ যদি আপনি "শব্দ" দিয়ে সন্ধান করেন যা আপনি নিয়মিত অভিব্যক্তির জন্য ব্যবহৃত বিশেষ অক্ষরগুলিকে অন্তর্ভুক্ত করেন তবে আপনাকে সেগুলি "পালাতে" হবে, যা টিজে বলেছেন যে কিছুটা জটিল (যদিও অসম্ভব নয়)।
পয়েন্টি

আপনি যদি স্ট্রিং 2 এর ভিতরে স্ট্রিং 1 এর শেষ ঘটনাটি প্রতিস্থাপন করতে চান?
সুপারউবারডুপার 21'15

4
@ সুপারউবারডুপারটি যদি আপনি "/" অক্ষরের সাথে ঘিরে থাকা কোনও কিছুর সাথে মেলে করতে চান তবে তা ভাল। একটি RegExp উদাহরণ তৈরি করার দুটি উপায় রয়েছে: কনস্ট্রাক্টর ( new RegExp(string)) এবং ইনলাইন সিনট্যাক্স ( /something/)। আপনি যখন RegExp কনস্ট্রাক্টর ব্যবহার করছেন তখন আপনার "/" অক্ষর প্রয়োজন হবে না।
পয়েন্টি

4
@ টেকলাইফ আপনাকে ` - things like + , * , ? `, প্রথম বন্ধনী, স্কোয়ার ব্র্যাকেট, সম্ভবত অন্যান্য জিনিসের সাহায্যে সমস্ত রেজেক্স মেটাচার্যাক্টরকে" সুরক্ষিত "করতে স্ট্রিংয়ে রূপান্তরটি প্রয়োগ করতে হবে ।
পয়েন্টি

36

আপনি String#lastIndexOfশব্দের শেষ উপস্থিতি এবং তারপরে String#substringএবং প্রতিস্থাপনের স্ট্রিংটি তৈরি করতে কনটেক্সটেশন ব্যবহার করতে পারেন ।

n = str.lastIndexOf(list[i]);
if (n >= 0 && n + list[i].length >= str.length) {
    str = str.substring(0, n) + "finish";
}

... বা এই লাইন বরাবর।


4
আর একটি উদাহরণ: var nameSplit = item.name.lastIndexOf (","); if (nameSplit! = -1) item.name = item.name.substr (0, nameSplit) + "এবং" + "আইটেম.নেম.সুবস্ট্র (নাম স্প্লিট + 2);
বেন গোটো

23

আমি জানি এটি নিরীহ, তবে আমি আজ সকালে সৃজনশীল বোধ করছি:

'one two, one three, one four, one'
.split(' ') // array: ["one", "two,", "one", "three,", "one", "four,", "one"]
.reverse() // array: ["one", "four,", "one", "three,", "one", "two,", "one"]
.join(' ') // string: "one four, one three, one two, one"
.replace(/one/, 'finish') // string: "finish four, one three, one two, one"
.split(' ') // array: ["finish", "four,", "one", "three,", "one", "two,", "one"]
.reverse() // array: ["one", "two,", "one", "three,", "one", "four,", "finish"]
.join(' '); // final string: "one two, one three, one four, finish"

সুতরাং সত্যই, আপনার যা করতে হবে তা হ'ল স্ট্রিং প্রোটোটাইপে এই ফাংশনটি যুক্ত করুন:

String.prototype.replaceLast = function (what, replacement) {
    return this.split(' ').reverse().join(' ').replace(new RegExp(what), replacement).split(' ').reverse().join(' ');
};

তারপরে এটি চালান: str = str.replaceLast('one', 'finish');

আপনার জানা উচিত একটি সীমাবদ্ধতা হ'ল, যেহেতু ফাংশনটি স্পেস দ্বারা বিভক্ত হয়ে গেছে, আপনি সম্ভবত কোনও স্থান দিয়ে কোনও কিছুই সন্ধান / প্রতিস্থাপন করতে পারবেন না।

প্রকৃতপক্ষে, এখন আমি এটির কথা ভাবি, আপনি খালি টোকেন দিয়ে বিভক্ত হয়ে 'স্পেস' সমস্যাটি পেতে পারেন।

String.prototype.reverse = function () {
    return this.split('').reverse().join('');
};

String.prototype.replaceLast = function (what, replacement) {
    return this.reverse().replace(new RegExp(what.reverse()), replacement.reverse()).reverse();
};

str = str.replaceLast('one', 'finish');

12
@ আলেকজান্ডার উহহ্, দয়া করে এটি প্রোডাকশন কোডে ব্যবহার করবেন না ... বা কোনও কোড ... একটি সরল রেজেক্স যথেষ্ট।
সামান্য

12

উপরের রেজেক্স উত্তরগুলির মতো মার্জিত নয়, তবে আমাদের মধ্যে জ্ঞানহীনদের পক্ষে অনুসরণ করা সহজ:

function removeLastInstance(badtext, str) {
    var charpos = str.lastIndexOf(badtext);
    if (charpos<0) return str;
    ptone = str.substring(0,charpos);
    pttwo = str.substring(charpos+(badtext.length));
    return (ptone+pttwo);
}

আমি বুঝতে পারি যে এটি সম্ভবত রেগেক্স উদাহরণগুলির চেয়ে ধীর এবং বেশি অপব্যয়যুক্ত, তবে আমি মনে করি যে স্ট্রিং ম্যানিপুলেশনগুলি কীভাবে করা যায় তার উদাহরণ হিসাবে এটি সহায়ক হতে পারে। (এটি কিছুটা ঘনীভূতও করা যেতে পারে তবে আমি আবার প্রতিটি পদক্ষেপটি পরিষ্কার হতে চেয়েছিলাম))


9

এখানে একটি পদ্ধতি যা কেবল বিভাজন এবং যোগদানের ব্যবহার করে। এটি কিছুটা বেশি পঠনযোগ্য তাই এটি ভাগ করে নেওয়ার মতো ভেবেছিল:

    String.prototype.replaceLast = function (what, replacement) {
        var pcs = this.split(what);
        var lastPc = pcs.pop();
        return pcs.join(what) + replacement + lastPc;
    };

এটি ভালভাবে কাজ করে, তবে স্ট্রিংটিতে কিছুটা অন্তর্ভুক্ত না থাকলে স্ট্রিংটি শুরু করার ক্ষেত্রে এটি প্রতিস্থাপন যুক্ত করবে what। উদাহরণস্বরূপ'foo'.replaceLast('bar'); // 'barfoo'
পাই 6 কে

8

ভেবেছি আমি এখানে উত্তর দেই যেহেতু এটি আমার গুগল অনুসন্ধানে প্রথম এসেছিল এবং এর কোনও উত্তর নেই (ম্যাট এর সৃজনশীল উত্তরের বাইরে :)) যা অক্ষরগুলির একটি স্ট্রিংয়ের শেষ ঘটনাটি সাধারণভাবে প্রতিস্থাপন করে যখন প্রতিস্থাপনের পাঠ্যটি শেষে নাও হতে পারে স্ট্রিং এর।

if (!String.prototype.replaceLast) {
    String.prototype.replaceLast = function(find, replace) {
        var index = this.lastIndexOf(find);

        if (index >= 0) {
            return this.substring(0, index) + replace + this.substring(index + find.length);
        }

        return this.toString();
    };
}

var str = 'one two, one three, one four, one';

// outputs: one two, one three, one four, finish
console.log(str.replaceLast('one', 'finish'));

// outputs: one two, one three, one four; one
console.log(str.replaceLast(',', ';'));

5

কোনও রেইগেক্স ছাড়াই একটি সহজ উত্তর হবে:

str = str.substr(0, str.lastIndexOf(list[i])) + 'finish'

4
মূল স্ট্রিংয়ের কোনও উপস্থিতি না থাকলে কী হবে?
তোমাজাহলিন

সর্বাধিক গৃহীত উত্তর আমার মতো একই ফলাফল দেয়! : এখানে পরীক্ষার ফলাফল হল
টিম লং

খনি:> s = s.substr (0, s.lastIndexOf ('d')) + 'সমাপ্তি' => 'সমাপ্তি' ... তাদের:> s = s.replace (নতুন RegExp ('d' + '$) '),' সমাপ্তি ') =>' সমাপ্তি '
টিম লং

2

আপনি কি কেবল স্ট্রিংটিকে বিপরীত করতে এবং বিপরীত অনুসন্ধান প্যাটার্নের প্রথম উপস্থিতিটি প্রতিস্থাপন করতে পারেননি? আমি চিন্তা করছি . । ।

var list = ['one', 'two', 'three', 'four'];
var str = 'one two, one three, one four, one';
for ( var i = 0; i < list.length; i++)
{
     if (str.endsWith(list[i])
     {
         var reversedHaystack = str.split('').reverse().join('');
         var reversedNeedle = list[i].split('').reverse().join('');

         reversedHaystack = reversedHaystack.replace(reversedNeedle, 'hsinif');
         str = reversedHaystack.split('').reverse().join('');
     }
 }

2

গতি যদি গুরুত্বপূর্ণ হয় তবে এটি ব্যবহার করুন:

/**
 * Replace last occurrence of a string with another string
 * x - the initial string
 * y - string to replace
 * z - string that will replace
 */
function replaceLast(x, y, z){
    var a = x.split("");
    var length = y.length;
    if(x.lastIndexOf(y) != -1) {
        for(var i = x.lastIndexOf(y); i < x.lastIndexOf(y) + length; i++) {
            if(i == x.lastIndexOf(y)) {
                a[i] = z;
            }
            else {
                delete a[i];
            }
        }
    }

    return a.join("");
}

এটি রেজিপ্যাক্স ব্যবহারের চেয়ে দ্রুত।


2

সহজ সমাধান হ'ল সাবস্ট্রিং পদ্ধতি ব্যবহার করা। যেহেতু স্ট্রিংটি তালিকা উপাদানের সাথে শেষ হচ্ছে, আমরা স্ট্রিং.লেন্থ ব্যবহার করতে পারি এবং lastIndexOfপদ্ধতি ব্যবহার না করে স্ট্রিংয়ের জন্য শেষ সূচক গণনা করতে পারি

str = str.substring(0, str.length - list[i].length) + "finish"


1

পুরানো ফ্যাশন এবং বড় কোড তবে সম্ভব হিসাবে দক্ষ:

function replaceLast(origin,text){
    textLenght = text.length;
    originLen = origin.length
    if(textLenght == 0)
        return origin;

    start = originLen-textLenght;
    if(start < 0){
        return origin;
    }
    if(start == 0){
        return "";
    }
    for(i = start; i >= 0; i--){
        k = 0;
        while(origin[i+k] == text[k]){
            k++
            if(k == textLenght)
                break;
        }
        if(k == textLenght)
            break;
    }
    //not founded
    if(k != textLenght)
        return origin;

    //founded and i starts on correct and i+k is the first char after
    end = origin.substring(i+k,originLen);
    if(i == 0)
        return end;
    else{
        start = origin.substring(0,i) 
        return (start + end);
    }
}

1

আমি উপরের উত্তরগুলির কোনও পছন্দ করি নি এবং নীচে নিয়ে এসেছি

function replaceLastOccurrenceInString(input, find, replaceWith) {
    if (!input || !find || !replaceWith || !input.length || !find.length || !replaceWith.length) {
        // returns input on invalid arguments
        return input;
    }

    const lastIndex = input.lastIndexOf(find);
    if (lastIndex < 0) {
        return input;
    }

    return input.substr(0, lastIndex) + replaceWith + input.substr(lastIndex + find.length);
}

ব্যবহার:

const input = 'ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty';
const find = 'teen';
const replaceWith = 'teenhundred';

const output = replaceLastOccurrenceInString(input, find, replaceWith);
console.log(output);

// output: ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteenhundred twenty

আশা করি এইটি কাজ করবে!


0

আমি প্রতিস্থাপন-শেষ এনপিএম প্যাকেজটি ব্যবহার করার পরামর্শ দেব ।

var str = 'one two, one three, one four, one';
var result = replaceLast(str, 'one', 'finish');
console.log(result);
<script src="https://unpkg.com/replace-last@latest/replaceLast.js"></script>

এটি স্ট্রিং এবং রেজেক্স প্রতিস্থাপনের জন্য কাজ করে।


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