Thay thế lần xuất hiện cuối cùng của ký tự trong chuỗi


75

Có cách nào dễ dàng trong javascript để thay thế sự xuất hiện cuối cùng của dấu '_' (dấu gạch dưới) trong một chuỗi nhất định không?


Nó luôn luôn là ký tự cuối cùng của chuỗi? Nếu không, có một cái nhìn tại string.lastIndexOf (searchstring, bắt đầu)
skarmats


Câu trả lời:


131

Bạn không cần jQuery, chỉ cần một biểu thức chính quy.

Thao tác này sẽ xóa dấu gạch dưới cuối cùng:

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

Điều này sẽ thay thế nó bằng nội dung của biến replacement:

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

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


2
@Martin Jespersen: điều gì sẽ xảy ra nếu văn bản được thay thế không phải là dấu gạch dưới mà là nội dung của một biến có tên là ReplaceMe? Regex nên được sửa đổi như thế nào?
Pierpaolo

1
@Pierpaolo: Bạn sẽ phải tạo regexp bằng cách sử dụng a new RegExp, đọc tất cả về nó ở đây: developer.mozilla.org/en-US/docs/JavaScript/Guide/… - Hãy nhớ thoát khỏi replaceMebiến để nó không chứa biến đặc biệt nhân vật mà sẽ làm thay đổi biểu thức chính quy
Martin Jespersen

@Martin Jespersen: cảm ơn vì liên kết. Tôi đã biết về new RegExpcú pháp. Câu hỏi của tôi giống như "tôi nên đặt biến ReplaceMe" ở đâu? ví dụ: var aRegExpr = new RegExp("_([^"+replaceMe+"]*)$");
Pierpaolo

@Pierpaolo: nó không phải là tbh đơn giản vì bạn có thể có một từ và không chỉ là một char duy nhất trong một biến - bạn nên bắt đầu một câu hỏi mới về nó :) Nó là quá phức tạp cho một bình luận ở đây
Martin Jespersen

Cảm ơn. Tôi hiểu, tôi sẽ tìm kiếm xem đã có chưa.
Pierpaolo

70

Không cần jQuery hoặc regex giả sử ký tự bạn muốn thay thế tồn tại trong chuỗi

Thay thế ký tự cuối cùng trong một chuỗi

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

Thay thế dấu gạch dưới cuối cùng trong một chuỗi

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

hoặc sử dụng một trong các biểu thức chính quy từ các câu trả lời khác

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 cho "không cần jQuery". Điều quan trọng cần biết là không phải JQuery không phải là câu trả lời cho mọi thứ. Javascript là một ngôn ngữ lập trình có khả năng hoàn hảo mà không cần phải đẩy mọi thứ thông qua jquery.
Spudley

1
@Spudley Đúng vậy. Tuy nhiên ở đây tại SO, không có câu trả lời JS là trọn vẹn nếu thiếu một phiên bản jQuery;))
mplungjan

4
+1cho không regex & lastIndexOf(...)không tìm kiếm từ END (hiệu suất tốt hơn) để regexp chấp nhận hiện nay thậm chí có thể không được nhanh hơn.
jave.web

"nor regex" .... giải pháp này không hoạt động nếu chuỗi không chứa dấu gạch dưới. Phiên bản Regex không. Bạn không thể thêm ký tự thay thế nếu không cần thiết.
tedebus

@tedebus vui lòng đọc câu hỏi. Ngoài ra một số ví dụ có thể xử lý bất kỳ ký tự cuối cùng
mplungjan

8

Cái này thì sao?

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
Hoạt động như một sự quyến rũ!
JRichardsz

3

Giữ nó đơn giản

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

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

3

Một cách siêu rõ ràng khác để làm điều này có thể như sau:

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


1

Điều này rất giống với câu trả lời của mplungjan, nhưng có thể dễ dàng hơn một chút (đặc biệt là nếu bạn cần thực hiện thao tác chuỗi khác ngay sau đó và muốn giữ nó dưới dạng một mảng) Dù sao, tôi chỉ nghĩ rằng tôi sẽ đưa nó ra khỏi đó phòng khi ai đó thích nó.

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'

'_' Có thể được hoán đổi bằng ký tự mà bạn muốn thay thế

Và '-' có thể được thay thế bằng ký tự hoặc chuỗi mà bạn muốn thay thế bằng


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

Phá vỡ:

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

0

Bạn có thể sử dụng mã này

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

Đây là một cách đệ quy loại bỏ nhiều lần xuất hiện của "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)


Đây không phải là những gì đã được hỏi. Tôi đã trả lời những gì đã hỏi và tôi đoán tôi đã nhận được phản hồi từ bạn. Cũng endsWith không tương thích với trình duyệt IE
mplungjan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.