아래 내 코드 스 니펫을 참조하십시오.
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'