Ersetzen Sie das letzte Vorkommen eines Zeichens in der Zeichenfolge

75

Gibt es eine einfache Möglichkeit in Javascript, das letzte Auftreten eines '_' (Unterstrichs) in einer bestimmten Zeichenfolge zu ersetzen?

CLiown
quelle
Ist es immer das letzte Zeichen der Zeichenfolge? Wenn nicht, werfen Sie einen Blick auf string.lastIndexOf (Suchzeichenfolge, Start)
Skarmats

Antworten:

130

Sie benötigen jQuery nicht, sondern nur einen regulären Ausdruck.

Dadurch wird der letzte Unterstrich entfernt:

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

Dadurch wird es durch den Inhalt der Variablen ersetzt replacement:

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

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

Martin Jespersen
quelle
2
@ Martin Jespersen: Was ist, wenn der zu ersetzende Text nicht der Unterstrich, sondern der Inhalt einer Variablen namens replaceMe ist? Wie soll der Regex geändert werden?
Pierpaolo
1
@Pierpaolo: Sie müssten den regulären Ausdruck mit a erstellen. new RegExpLesen Sie hier alles darüber: developer.mozilla.org/en-US/docs/JavaScript/Guide/… - Denken Sie daran, die replaceMeVariable zu maskieren , damit sie keine speziellen enthält Zeichen, die den regulären Ausdruck verändern
Martin Jespersen
@ Martin Jespersen: Danke für den Link. Ich wusste bereits über die new RegExpSyntax Bescheid . Meine Frage war eher wie "Wo soll ich die Variable replaceMe platzieren"? zB: var aRegExpr = new RegExp("_([^"+replaceMe+"]*)$");
Pierpaolo
@Pierpaolo: Es ist nicht so einfach, da Sie ein Wort und nicht nur ein einzelnes Zeichen in einer Variablen haben können - Sie sollten eine neue Frage dazu beginnen :) Es ist zu kompliziert für einen Kommentar hier
Martin Jespersen
Vielen Dank. Ich verstehe, ich werde suchen, ob es bereits eine gibt.
Pierpaolo
69

Es ist weder jQuery noch Regex erforderlich, vorausgesetzt, das zu ersetzende Zeichen ist in der Zeichenfolge vorhanden

Ersetzen Sie das letzte Zeichen in einer Zeichenfolge

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

Ersetzen Sie den letzten Unterstrich in einer Zeichenfolge

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

oder verwenden Sie einen der regulären Ausdrücke aus den anderen Antworten

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

mplungjan
quelle
6
+1 für "keine Notwendigkeit für jQuery". Es ist wichtig zu wissen, dass nicht JQuery nicht die Antwort auf alles ist. Javascript ist eine perfekt fähige Programmiersprache, ohne alles durch jquery schieben zu müssen.
Spudley
1
@ Spudley So wahr. Allerdings ist hier bei SO keine JS-Antwort ohne eine jQuery-Version vollständig;))
mplungjan
4
+1für keine Regex & lastIndexOf(...)führt die Suche vom ENDE aus (bessere Leistung), so dass die aktuell akzeptierte Regexp nicht schneller sein kann.
jave.web
"nor regex" .... diese Lösung funktioniert nicht, wenn der String keinen Unterstrich enthält. Regex-Version tut. Sie können das Ersetzungszeichen nicht hinzufügen, wenn es nicht benötigt wird.
Tedebus
@tedebus bitte lesen Sie die Frage. Auch einige der Beispiele können mit jedem letzten Zeichen
umgehen
8

Was ist damit?

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

replaceLast("Hello world!", "l", "x"); // Hello worxd!
Harry Stevens
quelle
1
Klappt wunderbar!
JRichardsz
3

Ein anderer super klarer Weg, dies zu tun, könnte wie folgt sein:

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

Halte es einfach

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

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

Dies ist der Antwort von mplungjan sehr ähnlich, kann aber etwas einfacher sein (insbesondere, wenn Sie direkt danach andere Zeichenfolgenmanipulationen durchführen müssen und diese als Array behalten möchten). Ich dachte nur, ich würde sie für den Fall veröffentlichen, dass jemand sie veröffentlicht bevorzugt es.

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'

Das '_' kann gegen das Zeichen ausgetauscht werden, das Sie ersetzen möchten

Und das '-' kann durch das Zeichen oder den String ersetzt werden, durch den Sie es ersetzen möchten

Teilwissenschaft
quelle
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)
)

Nervenzusammenbruch:

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

Sie können diesen Code verwenden

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

Tabish Usman
quelle
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 :)'

Steffan
quelle
0

Dies ist eine rekursive Methode, mit der mehrere Vorkommen von "Endchar" entfernt werden:

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)

Tedebus
quelle
Dies wurde nicht gefragt. Ich habe geantwortet, was gefragt wurde, und ich glaube, ich habe eine Ablehnung von Ihnen bekommen. Auch endetWith ist nicht kompatibel mit IE
mplungjan