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로 바꾸고 싶습니다. 대체 방법은 첫 번째 단어만 대체하기 때문에 제가 가진 것은 작동하지 않을 것입니다.마지막 '하나' 인스턴스만 바꾸도록 스니펫을 수정하는 방법을 아는 사람이 있습니까?
문자열이 패턴으로 끝나는 경우 다음 작업을 수행할 수 있습니다.
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";
}
...아니면 그 노선들을 따라.
위의 정규식처럼 우아하지는 않지만, 우리 중에 익숙하지 않은 사람들은 따라하기가 더 쉽습니다.
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;
};
구글 검색에서 이것이 먼저 나왔고 대체할 텍스트가 문자열의 끝에 없을 때 일반적으로 마지막 문자열을 대체하는 답변(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.substring(0, str.lastIndexOf(list[i])) + 'finish'
저는 위의 답변 중 마음에 드는 것이 하나도 없어서 아래와 같이 생각해냈습니다.
function isString(variable) {
return typeof (variable) === 'string';
}
function replaceLastOccurrenceInString(input, find, replaceWith) {
if (!isString(input) || !isString(find) || !isString(replaceWith)) {
// 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
도움이 되길 바랍니다!
부정적인 미래 전망 솔루션:
str.replace(/(one)(?!.*\1)/, 'finish')
regex101.com 사이트에서 제공하는 설명,
/(one)(?!.*\1)/
첫 번째 캡처 그룹(1개)
one
문자와 문자 그대로 일치합니다(대소문자 구분).
부정적인 전망 (?!.*\1)
아래 정규식이 일치하지 않는다고 주장합니다.
.
임의의 문자와 일치합니다(행 종료자 제외).*
0회에서 무제한 사이의 이전 토큰과 일치하며, 가능한 한 여러 번 필요에 따라 반환합니다(계속).\1
첫 번째 캡처 그룹에서 가장 최근에 일치한 텍스트와 일치합니다.
문자열을 반대로 하고 반대 검색 패턴의 첫 번째 항목만 대체할 수는 없을까요?제 생각엔..
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('');
}
}
속도가 중요한 경우 다음을 사용합니다.
/**
* 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("");
}
RegExp를 사용하는 것보다 빠릅니다.
간단한 해결책은 하위 문자열 방법을 사용하는 것입니다.요소로 에 string할 수 있고 string list를 할 수 .lastIndexOf
방법
str = str.substring(0, str.length - list[i].length) + "finish"
function replaceLast(text, searchValue, replaceValue) {
const lastOccurrenceIndex = text.lastIndexOf(searchValue)
return `${
text.slice(0, lastOccurrenceIndex)
}${
replaceValue
}${
text.slice(lastOccurrenceIndex + searchValue.length)
}`
}
구식이고 빅 코드이지만 가능한 한 효율적입니다.
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);
}
}
저는 마지막 교체 npm 패키지를 사용하는 것을 제안합니다.
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>
문자열 및 정규식 대체에 사용할 수 있습니다.
if (string.search(searchstring)>-1) {
stringnew=((text.split("").reverse().join("")).replace(searchstring,
subststring).split("").reverse().join(""))
}
//with var string= "sdgu()ert(dhfj ) he ) gfrt"
//var searchstring="f"
//var subststring="X"
//var stringnew=""
//results in
//string : sdgu()ert(dhfj ) he ) gfrt
//stringnew : sdgu()ert(dhfj ) he ) gXrt
str = (str + '?').replace(list[i] + '?', 'finish');
언급URL : https://stackoverflow.com/questions/2729666/javascript-replace-last-occurrence-of-text-in-a-string
'programing' 카테고리의 다른 글
테이블 내부에만 테두리를 적용하려면 어떻게 해야 합니까? (0) | 2023.08.27 |
---|---|
스프링 주석을 사용하여 동일한 클래스의 여러 콩 인스턴스화 (0) | 2023.08.27 |
텍스트 영역에 대한 val() vs. text() (0) | 2023.08.27 |
왼쪽/오른쪽 조인이 예상대로 null을 반환하지 않음 (0) | 2023.08.27 |
작업을 실행할 때 AWS ECS 오류:클러스터에서 컨테이너 인스턴스를 찾을 수 없습니다. (0) | 2023.08.27 |