从字符串中删除最后一个字符

195

我有一个字符串,比如说

"Hello! world!" 

我想要对字符串进行修剪或删除操作,将字符串中的感叹号从"world!"中移除,但是不要从"Hello!"中移除。

1
也许超出了您的要求,但我可以问一下,您能否花点时间考虑使用我提出的正则表达式呢? - Marcello Faga
1
可能是删除字符串的最后一个字符的重复问题。 - Tor Klingberg
2
在C#8+中,您可以使用“范围”来执行此操作:"Hello! world!"[..^1]; // 产生 "Hello! world" - Granger
15个回答

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

查看更多

编辑:

我注意到在这类问题中,几乎每个人都建议删除给定字符串的最后一个字符。但是这并不符合 Trim 方法的定义。

Trim - 从此实例的开头和结尾移除所有空白字符的出现。

MSDN-Trim

根据该定义,仅从字符串中删除最后一个字符是不好的解决方案。

因此,如果我们想要“从字符串中删除最后一个字符”,我们应该这样做:

可以将其作为扩展方法实现,例如:

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

注意,如果您想删除所有相同值的字符,例如(!!!!),则上面的方法会从字符串末尾删除所有 '!' 的存在, 但是如果您只想删除最后一个字符,则应使用以下内容:

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

1
只要您始终知道要从字符串末尾删除哪个字符,这种方法就更好。 - Nimrod Shory
1
嗨Vash,你觉得我使用正则表达式的解决方案怎么样?它满足了Thqr的要求,并且可以在一行代码中从任何“world!”表达式中删除“!”字符,无论表达式放置在哪里。 - Marcello Faga
36
这个解决方案将删除所有相同的结尾字符!例如,它会将“Hello!!!!!!!!”转换为“Hello”,这实际上比仅仅删除最后一个字符更多。 - Kugel
1
@Kugel,你说得完全正确,这就是为什么你应该再读一遍我的答案。为了解释,OP并没有问如何删除最后一个字符,而是如何修剪它。 - Damian Leszczyński - Vash
1
@Vash - 你如何使用方法 - "Hello! world!".TrimEnd('!'); 去除单引号 '? - Steam
显示剩余5条评论

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

17
请确保你的字符串(yourString)至少包含1个字符。 - Nimrod Shory
1
保证你的字符串总是以你想要删除的字符结尾,例如:"Hello! World" 将变成 "Hello! Worl"。 - Nathan Koop

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

或者

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

如果你想要删除末尾的非空格字符,可以这样做。


10
我点赞只是为了抵消那个没有附言的踩。讨厌人们这样做。 - Jeff Reddy
2
可能是因为没有TrimEnd()方法,如果有的话,它可能会使后续的Substring(..)调用在短字符串上失败。 - Rory

7
在 .NET 5 / C# 8 中:
你可以将标记为答案的代码写成:
public static class StringExtensions
{
    public static string TrimLastCharacters(this string str) => string.IsNullOrEmpty(str) ? str : str.TrimEnd(str[^1]);
}

但是,如答案中所述,这将删除该字符的所有出现。如果您只想删除最后一个字符,则应使用以下方法:

    public static string RemoveLastCharacter(this string str) => string.IsNullOrEmpty(str) ? str : str[..^1];

C# 8 中的新功能简介:

符号 ^ 称为“索引从末尾算起运算符”。符号 .. 称为“范围运算符”。^1arr.length - 1 的简写。您可以使用 arr[1..] 获取数组中第一个字符后的所有项,或使用 arr[..^1] 获取最后一项之前的所有项。这只是一些快速示例。有关更多信息,请参见https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8 的“索引和范围”部分。


1
对于 .net 5 及更新版本(我目前使用的是 6),这应该是答案。它比所有其他推荐的解决方案都要简单得多。最后的“快速解释”帮助我深入理解了底层的实际情况。 - RoadRacer524
1
对于 .net 5 及更新版本(我目前使用的是 6),这应该是答案。这比所有其他推荐的解决方案都要简单得多。最后的“简要解释”帮助我深入理解了底层的实际运作。 - undefined

6

从字符串中删除最后一个字符的另一个示例:

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

你可以将其放入扩展方法并防止它为空字符串等。

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

如何使用endswith属性?它可以在这里使用吗? - userAZLogicApps
1
Trim() 的命名非常糟糕。它修剪所有前导和尾随字符(复数),TrimStart() 和 TrimEnd() 也是如此。 - Antony Booth

6

试试这个:

return( (str).Remove(str.Length-1) );

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

3
非常简单易懂:

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

意思是将字符串 str 的最后一个字符删除。

1
这正是我所寻找的,其他的解决方案过于复杂了。 - Khandakar Rashed Hassan
这会删除最后一个字符,无论它是什么,而问题明确要求从末尾修剪'!'。它也不检查字符串是否有任何内容可以修剪,因此对于空字符串,您将获得System.ArgumentOutOfRangeException。 - Antony Booth
@AntonyBooth 是的,因为问题是“从字符串中删除最后一个字符”,并且没有检查义务。 - Seyfi
要求是:标题:从字符串中删除最后一个字符。主题:我想进行修剪或删除,以将!从world中去除,但不从Hello中去除。 这意味着感叹号应该从字符串的末尾删除,而不是从字符串的末尾修剪任何字符。 此外,无需说明代码示例应正常工作。 您的示例应类似于:str = null!= str && str.Length > 0?str.Remove(str.Length-1):str; 话虽如此,它仍然不能完全满足所述要求。 - Antony Booth

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接