[javascript] JavaScript : 문자열에서 마지막 텍스트 교체

아래 내 코드 스 니펫을 참조하십시오.

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')
     }
 }

1이라는 단어의 마지막 항목을 문자열의 finish 단어로 바꾸고 싶습니다. replace 메서드가 첫 번째 항목 만 교체하기 때문에 내가 가진 것은 작동하지 않습니다. 누구든지 내가 그 스 니펫을 수정하여 ‘하나’의 마지막 인스턴스 만 대체하도록하는 방법을 알고 있습니까?



답변

문자열이 실제로 패턴으로 끝나면 다음과 같이 할 수 있습니다.

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


답변

를 사용 String#lastIndexOf하여 단어의 마지막 항목을 찾은 다음 String#substring연결하여 대체 문자열을 작성할 수 있습니다.

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

… 또는 그 라인을 따라.


답변

나는 이것이 어리 석다는 것을 알고 있지만 오늘 아침에는 창의적인 느낌이 듭니다.

'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 프로토 타입에 추가하는 것입니다.

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');


답변

위의 정규식 답변만큼 우아하지는 않지만 우리 중 잘 모르는 사람들을 따라 가기가 더 쉽습니다.

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);
}

나는 이것이 정규식 예제보다 느리고 낭비 적이라는 것을 알고 있지만 문자열 조작이 어떻게 수행 될 수 있는지에 대한 예시로 도움이 될 것이라고 생각합니다. (약간 압축 할 수도 있지만 다시 한 번 각 단계를 명확하게하고 싶었습니다.)


답변

분할과 결합 만 사용하는 방법은 다음과 같습니다. 좀 더 읽기 쉬워서 공유 할 가치가 있다고 생각했습니다.

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


답변

이것이 내 Google 검색에서 처음 왔기 때문에 여기에 대답 할 것이라고 생각했으며 대체 할 텍스트가 끝에 없을 때 일반적으로 문자열의 마지막 발생을 대체하는 대답이 없습니다 (Matt의 창의적인 대답 외부 :)) 문자열의.

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(',', ';'));


답변

정규식이없는 간단한 대답은 다음과 같습니다.

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