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


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.