Cắt ký tự cuối cùng từ một chuỗi


156

Tôi có một chuỗi nói

"Hello! world!" 

Tôi muốn làm một trim hoặc loại bỏ để đưa ra! tắt thế giới nhưng không tắt Hello.


1
Có thể nó nằm ngoài yêu cầu của bạn nhưng tôi có thể yêu cầu bạn dành một chút thời gian để suy nghĩ về việc sử dụng regex mà tôi đề xuất không?
Marcello Faga

1
Bản sao có thể có của Xóa chuỗi ký tự cuối cùng
Tor Klingberg

Câu trả lời:


298
"Hello! world!".TrimEnd('!');

đọc thêm

BIÊN TẬP:

Những gì tôi đã nhận thấy trong loại câu hỏi này mà mọi người khá gợi ý để loại bỏ char cuối cùng của chuỗi đã cho. Nhưng điều này không đáp ứng định nghĩa của phương pháp Trim.

Trim - Loại bỏ tất cả các lần xuất hiện của các ký tự khoảng trắng từ đầu và cuối của trường hợp này.

MSDN-Trim

Theo định nghĩa này, chỉ loại bỏ ký tự cuối cùng khỏi chuỗi là giải pháp xấu.

Vì vậy, nếu chúng ta muốn "Cắt nhân vật cuối cùng khỏi chuỗi", chúng ta nên làm một cái gì đó như thế này

Ví dụ như phương thức mở rộng:

public static class MyExtensions
{
  public static string TrimLastCharacter(this String str)
  {
     if(String.IsNullOrEmpty(str)){
        return str;
     } else {
        return str.TrimEnd(str[str.Length - 1]);
     }
  }
}

Lưu ý nếu bạn muốn xóa tất cả các ký tự có cùng giá trị, tức là (!!!!) phương thức trên sẽ xóa tất cả các tồn tại của '!' từ cuối chuỗi, nhưng nếu bạn muốn xóa chỉ ký tự cuối cùng, bạn nên sử dụng ký tự này:

else { return str.Remove(str.Length - 1); }

1
Điều này tốt hơn miễn là bạn luôn biết bạn muốn xóa ký tự nào từ cuối Chuỗi.
Nimrod Shory

1
Xin chào Vash, bạn nghĩ gì về giải pháp của tôi khi sử dụng RegEx? Nó đáp ứng yêu cầu của Thqr và cho phép xóa '!' char từ bất kỳ "thế giới!" biểu thức, bất cứ nơi nào biểu thức được đặt, chỉ trong một dòng mã.
Marcello Faga

24
-1 Giải pháp này sẽ loại bỏ tất cả các ký tự kết thúc giống nhau! Ví dụ: Nó sẽ biến "Xin chào !!!!!!!!" vào "Xin chào", đang loại bỏ nhiều hơn ký tự cuối cùng.
Kugel

1
@Kugel, Bạn hoàn toàn đúng, và đó là lý do tại sao bạn nên đọc thêm một lần câu trả lời của tôi. Để giải thích, OP không hỏi cách xóa ký tự cuối cùng, nhưng làm thế nào để cắt bớt nó.
Damian Leszczyński - Vash

1
@Vash - làm thế nào để bạn xóa một trích dẫn 'sử dụng phương thức - "Xin chào! Thế giới!". TrimEnd ('! ');
Hơi nước

65
String withoutLast = yourString.Substring(0,(yourString.Length - 1));

14
Chỉ cần chắc chắn rằng yourString chứa ít nhất 1 ký tự.
Nimrod Shory

đồng thời đảm bảo chuỗi của bạn luôn kết thúc bằng ký tự bạn muốn xóa EG: "Xin chào! Thế giới" sẽ kết thúc là "Xin chào! Xấu nhất".
Nathan Koop

9
if (yourString.Length > 1)
    withoutLast = yourString.Substring(0, yourString.Length - 1);

hoặc là

if (yourString.Length > 1)
    withoutLast = yourString.TrimEnd().Substring(0, yourString.Length - 1);

... trong trường hợp bạn muốn xóa một ký tự không phải khoảng trắng từ cuối.


9
Tôi upvote chỉ để bù đắp downvote mà không có một bình luận. Ghét nó khi mọi người làm điều đó.
Jeff Reddy

2
Có thể là do không có TrimEnd()phương pháp và nếu có nó có thể khiến Substring(..)cuộc gọi tiếp theo thất bại trên các chuỗi ngắn.
Rory

7
        string s1 = "Hello! world!";
        string s2 = s1.Trim('!');

Làm thế nào để làm việc với tài sản endswith? nó có thể được sử dụng ở đây?
userAZLogicApps

1
Trim () được đặt tên rất tệ. Nó cắt tất cả các ký tự hàng đầu và dấu (số nhiều), cũng như TrimStart () và TrimEnd ()
Gian hàng Antony


5
string helloOriginal = "Hello! World!";
string newString = helloOriginal.Substring(0,helloOriginal.LastIndexOf('!'));

5

Một ví dụ khác về cắt xén ký tự cuối cùng từ một chuỗi:

string outputText = inputText.Remove(inputText.Length - 1, 1);

Bạn có thể đặt nó vào một phương thức mở rộng và ngăn nó khỏi chuỗi null, v.v.


3
string s1 = "Hello! world!"
string s2 = s1.Substring(0, s1.Length - 1);
Console.WriteLine(s1);
Console.WriteLine(s2);

2

bạn cũng có thể sử dụng cái này:

public static class Extensions
 {

        public static string RemovePrefix(this string o, string prefix)
        {
            if (prefix == null) return o;
            return !o.StartsWith(prefix) ? o : o.Remove(0, prefix.Length);
        }

        public static string RemoveSuffix(this string o, string suffix)
        {
            if(suffix == null) return o;
            return !o.EndsWith(suffix) ? o : o.Remove(o.Length - suffix.Length, suffix.Length);
        }

    }

1

Phiên bản sửa đổi một chút của @Damian Leszczyński - Vash sẽ đảm bảo rằng chỉ một nhân vật cụ thể sẽ bị xóa.

public static class StringExtensions
{
    public static string TrimLastCharacter(this string str, char character)
    {
        if (string.IsNullOrEmpty(str) || str[str.Length - 1] != character)
        {
            return str;
        }
        return str.Substring(0, str.Length - 1);
    }
}

0

Tôi đã chọn con đường viết một tiện ích mở rộng bằng TrimEnd chỉ vì tôi đã sử dụng nó nội tuyến và hài lòng với nó ... tức là:

static class Extensions
{
        public static string RemoveLastChars(this String text, string suffix)
        {            
            char[] trailingChars = suffix.ToCharArray();

            if (suffix == null) return text;
            return text.TrimEnd(trailingChars);
        }

}

Đảm bảo bạn bao gồm không gian tên trong các lớp của mình bằng lớp tĩnh; P và cách sử dụng là:

string _ManagedLocationsOLAP = string.Empty;
_ManagedLocationsOLAP = _validManagedLocationIDs.RemoveLastChars(",");          

0

Rất dễ dàng và đơn giản:

str = str.Remove (str.Lipse - 1);


0

Một ví dụ lớp Mở rộng để đơn giản hóa việc này: -

internal static class String
{
    public static string TrimEndsCharacter(this string target, char character) => target?.TrimLeadingCharacter(character).TrimTrailingCharacter(character);
    public static string TrimLeadingCharacter(this string target, char character) => Match(target?.Substring(0, 1), character) ? target.Remove(0,1) : target;
    public static string TrimTrailingCharacter(this string target, char character) => Match(target?.Substring(target.Length - 1, 1), character) ? target.Substring(0, target.Length - 1) : target;

    private static bool Match(string value, char character) => !string.IsNullOrEmpty(value) && value[0] == character;
}

Sử dụng

"!Something!".TrimLeadingCharacter('X'); // Result '!Something!' (No Change)
"!Something!".TrimTrailingCharacter('S'); // Result '!Something!' (No Change)
"!Something!".TrimEndsCharacter('g'); // Result '!Something!' (No Change)

"!Something!".TrimLeadingCharacter('!'); // Result 'Something!' (1st Character removed)
"!Something!".TrimTrailingCharacter('!'); // Result '!Something' (Last Character removed)
"!Something!".TrimEndsCharacter('!'); // Result 'Something'  (End Characters removed)

"!!Something!!".TrimLeadingCharacter('!'); // Result '!Something!!' (Only 1st instance removed)
"!!Something!!".TrimTrailingCharacter('!'); // Result '!!Something!' (Only Last instance removed)
"!!Something!!".TrimEndsCharacter('!'); // Result '!Something!'  (Only End instances removed)

-5

Nếu bạn muốn xóa '!' ký tự từ một biểu thức cụ thể ("thế giới" trong trường hợp của bạn), sau đó bạn có thể sử dụng biểu thức chính quy này

string input = "Hello! world!";

string output = Regex.Replace(input, "(world)!", "$1", RegexOptions.Multiline | RegexOptions.Singleline);

// result: "Hello! world"

ký tự đặc biệt $ 1 chứa tất cả các biểu thức "thế giới" phù hợp và được sử dụng để thay thế "thế giới!" ban đầu biểu hiện

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.