Замінити останнє входження символу в рядок


75

Чи є простий спосіб у javascript замінити останнє входження "_" (підкреслення) у даному рядку?


Це завжди останній символ рядка? Якщо ні, подивіться на string.lastIndexOf (searchstring, start)
— skarmats


Відповіді:


131

Вам не потрібен jQuery, просто регулярний вираз.

Це видалить останнє підкреслення:

var str = 'a_b_c';
console.log(  str.replace(/_([^_]*)$/, '$1')  ) //a_bc

Це замінить його вмістом змінної replacement:

var str = 'a_b_c',
    replacement = '!';

console.log(  str.replace(/_([^_]*)$/, replacement + '$1')  ) //a_b!c


2
@Martin Jespersen: а якщо текст, який потрібно замінити, - це не підкреслення, а вміст змінної, яка називається replaceMe? Як слід змінити регулярний вираз?
— Pierpaolo

1
@Pierpaolo: Вам доведеться створити регулярний вираз за допомогою a new RegExp, прочитайте все про це тут: developer.mozilla.org/en-US/docs/JavaScript/Guide/… - Не забудьте уникнути replaceMeзмінної, щоб вона не містила спеціальних символи, які змінять регулярний вираз
— Мартін Єсперсен

@Martin Jespersen: дякую за посилання. Я вже знав про new RegExpсинтаксис. Моє запитання було більше схоже на "куди слід поставити змінну replaceMe"? наприклад: var aRegExpr = new RegExp("_([^"+replaceMe+"]*)$");
— Pierpaolo

@Pierpaolo: це не так просто tbh, оскільки у вас може бути слово, а не просто один символ у змінній - вам слід почати нове запитання про це :) Це занадто складно для коментарів тут
— Мартін Єсперсен

Дякую. Я розумію, я буду шукати, чи вже є такий.
— Pierpaolo

70

Не потрібно ні jQuery, ні регулярного виразу, якщо припустимо, що символ, який ви хочете замінити, існує у рядку

Замініть останній символ у рядку

str = str.substring(0,str.length-2)+otherchar

Замінити останнє підкреслення в рядку

var pos = str.lastIndexOf('_');
str = str.substring(0,pos) + otherchar + str.substring(pos+1)

або скористайтеся одним із регулярних виразів з інших відповідей

var str1 = "Replace the full stop with a questionmark."
var str2 = "Replace last _ with another char other than the underscore _ near the end"

// Replace last char in a string

console.log(
  str1.substring(0,str1.length-2)+"?"
)  
// alternative syntax
console.log(
  str1.slice(0,-1)+"?"
)

// Replace last underscore in a string 

var pos = str2.lastIndexOf('_'), otherchar = "|";
console.log(
  str2.substring(0,pos) + otherchar + str2.substring(pos+1)
)
// alternative syntax

console.log(
  str2.slice(0,pos) + otherchar + str2.slice(pos+1)
)


7
+1 для "немає потреби в jQuery". Важливо знати, що не JQuery - це не відповідь на все. Javascript - це цілком здатна мова програмування, без необхідності проштовхувати все через jquery.
— Spudley

1
@Spudley Так правда. Однак тут, у SO, жодна відповідь JS не є повною без версії jQuery;))
— mplungjan

4
+1для жодного регулярного виразу & lastIndexOf(...)робить пошук з END (краща продуктивність), тому прийнятий на даний момент регулярний вираз навіть не може бути швидшим.
— jave.web

"ні регулярний вираз" .... це рішення не працює, якщо рядок не містить підкреслення. Версія регулярного виразу робить. Ви не можете додати символ заміни, якщо це не потрібно.
— тедебус

@tedebus, будь ласка, прочитайте питання. Також деякі з прикладів можуть обробляти будь-який останній символ
— mplungjan

8

Як що до цього?

function replaceLast(x, y, z){
  var a = x.split("");
  a[x.lastIndexOf(y)] = z;
  return a.join("");
}

replaceLast("Hello world!", "l", "x"); // Hello worxd!

1
Працює як шарм!
— JRichardsz

3

Не ускладнювати

var someString = "a_b_c";
var newCharacter = "+";

var newString = someString.substring(0, someString.lastIndexOf('_')) + newCharacter + someString.substring(someString.lastIndexOf('_')+1);

3

Ще один надзвичайно зрозумілий спосіб зробити це може бути наступним:

let modifiedString = originalString
   .split('').reverse().join('')
   .replace('_', '')
   .split('').reverse().join('')


1

Це дуже схоже на відповідь mplungjan, але може бути дещо простішим (особливо якщо вам потрібно виконати іншу маніпуляцію рядком відразу після і хочете зберегти його як масив) У будь-якому випадку, я просто думав, що викладу це там на випадок, якщо хтось воліє це.

var str = 'a_b_c';
str = str.split(''); //['a','_','b','_','c']
str.splice(str.lastIndexOf('_'),1,'-'); //['a','_','b','-','c']
str = str.join(''); //'a_b-c'

"_" Можна замінити символом, який ви хочете замінити

А знак "-" можна замінити символом або рядком, яким ви хочете його замінити


1

var someString = "(/n{})+++(/n{})---(/n{})$$$";
var toRemove = "(/n{})"; // should find & remove last occurrence 

function removeLast(s, r){
  s = s.split(r)
  return s.slice(0,-1).join(r) + s.pop()
}

console.log(
  removeLast(someString, toRemove)
)

Зламатися:

s = s.split(toRemove)         // ["", "+++", "---", "$$$"]
s.slice(0,-1)                 //  ["", "+++", "---"]   
s.slice(0,-1).join(toRemove)  // "})()+++})()---"
s.pop()                       //  "$$$"   

0

Ви можете використовувати цей код

var str="test_String_ABC";
var strReplacedWith=" and ";
var currentIndex = str.lastIndexOf("_");
str = str.substring(0, currentIndex) + strReplacedWith + str.substring(currentIndex + 1, str.length);

alert(str);


0

    // Define variables
    let haystack = 'I do not want to replace this, but this'
    let needle = 'this'
    let replacement = 'hey it works :)'
    
    // Reverse it
    haystack = Array.from(haystack).reverse().join('')
    needle = Array.from(needle).reverse().join('')
    replacement = Array.from(replacement).reverse().join('')
    
    // Make the replacement
    haystack = haystack.replace(needle, replacement)
    
    // Reverse it back
    let results = Array.from(haystack).reverse().join('')
    console.log(results)
    // 'I do not want to replace this, but hey it works :)'


0

Це рекурсивний спосіб, який видаляє кілька випадків "endchar":

function TrimEnd(str, endchar) {
  while (str.endsWith(endchar) && str !== "" && endchar !== "") {
    str = str.slice(0, -1);
  }
  return str;
}

var res = TrimEnd("Look at me. I'm a string without dots at the end...", ".");
console.log(res)


Це було не те, про що запитували. Я відповів на те, що запитував, і, мабуть, отримав від вас голос проти. Також кінцяWith не сумісна з IE
— mplungjan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.