如何使用正则表达式从字符串中删除最后一个逗号和空格(如果有)?

3

我有一个C#应用程序中的字符串,想知道正确的方法是什么,以检查最后两个字符是否为,(逗号和空格),如果是,则使用正则表达式将它们删除。


3
如果你坚持使用正则表达式解决方案,可以使用以下代码:string output = Regex.Replace("my string, ", ", $", ""); - Ulugbek Umirov
@UlugbekUmirov - 谢谢。我采用了你的解决方案。 - scapegoat17
4个回答

11

一个没有使用正则表达式的可行方案:

string str = "dfsf, ";

if (str.EndsWith(", "))
    str = str.Remove(str.Length - 2);

我们移除了2,因为2是", "的长度。

演示


10

你不需要使用正则表达式,可以使用String.TrimEnd,示例代码如下:

string updatedString = yourString.TrimEnd(',', ' ');

您也可以指定一个字符串并调用ToCharArray,例如:

string str = "something,  ,   ,,,,   ";
string updatedString = str.TrimEnd(", ".ToCharArray());

会给你"something"

如果你只想移除", "(逗号和空格在末尾)的单个实例,则使用:

if (str.EndsWith(", "))
    updatedString = str.Substring(0, str.Length - 2);

1
这也会删除多个尾随逗号/空格,这可能是可取的,但不符合OP所述的仅检查最后两个字符的要求。 - Dan Bryant
1
@DanBryant,我也为此提供了一个解决方案。 - Habib

2

不要删除尾随的逗号和空格,最好的方法是在一开始生成字符串时就不加额外的逗号。在生成逗号分隔值时,只需使用String.Join将所有字符串与特定分隔符连接在一起:

var line = string.Join(", ", yourCollectionOfValues);

使用Join函数会比将值逐个附加在一起更加简单快捷,而且Join函数已经处理好了确保没有尾随分隔符的问题。


@probrandono 试一下,看看吧。 - Servy
太好了!在大多数情况下,这将取代聚合!谢谢。 - cheny

1
抱歉我来晚了。

是的,这不是你必须或应该使用正则表达式的东西;但既然你问了如何用正则表达式做到这一点(例如,可能你只是好奇,“假设我必须使用正则表达式”是学习的好方法),考虑以下模式:

(.*?)(, )?$

您可以在相关正则表达式fiddle中进行测试。

重点:

  • (.*?) - 匹配零个或多个(*)除换行符外的任何字符(.),尽可能少地匹配(?)。
  • (, )?$ - 匹配零个或一个(?)逗号(,在结尾处$)。

此外,以下C#示例使用此模式...

var str1 = "whatever, ";
var str2 = "whatever, ,";
var str3 = "";

var regex = new Regex("(.*?)(, )?$");
var str1Match = regex.Match(str1);
var str2Match = regex.Match(str2);
var str3Match = regex.Match(str3);

Console.WriteLine(str1Match.Groups[1].Value);
Console.WriteLine(str2Match.Groups[1].Value);
Console.WriteLine(str3Match.Groups[1].Value);

...产生以下输出:

  • str1 ("whatever, ") => whatever
  • str2 ("whatever, ,") => whatever, ,
  • str3 ("") =>

它使用Groups[1].Value来获取第一个捕获组的值(即与(.*?)匹配的值,而不是(, )?(如果有的话))。

编辑:

我实际上很喜欢@UlugbekUmirov在他的评论中提出的方法(string output = Regex.Replace("my string, ", ", $", "");),因为它非常简单;但希望您能发现我概述的方法具有指导意义。


1
感谢您使用 regex 解决问题并提供详细的说明。尽管我稍微修改了一下以减少代码行数,但基本上还是采用了 @UlugbekUmirov 的解决方案,因此我将您标记为答案。 - scapegoat17
1
@scapegoat17:不用谢。如果您不想为了指导清晰度而分解每个步骤,那么缩短它是有必要的。我认为您打错了:Regex.Match(r,"(.*?)(, )?$)").ToString();会产生一个带有消息“parsing "(.*?)(, )?$)" - Too many )'s”的ArgumentException异常。我认为您可能正在寻找的是Regex.Match(r,"(.*?)(, )?$").Groups[1].Value - J0e3gan
1
没错,提交后发现了这一点,然后就直接把它删除了。再次感谢! - scapegoat17

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