【问题标题】:How to remove the last comma and space from string (if there) using regex?如何使用正则表达式从字符串(如果有)中删除最后一个逗号和空格?
【发布时间】:2018-09-13 20:09:30
【问题描述】:

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

【问题讨论】:

  • 如果您坚持使用正则表达式解决方案 - string output = Regex.Replace("my string, ", ", $", "");
  • @UlugbekUmirov - 谢谢。我同意了你的解决方案。

标签: c# regex


【解决方案1】:

没有正则表达式的工作解决方案:

string str = "dfsf, ";

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

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

demo

【讨论】:

    【解决方案2】:

    你不需要正则表达式,使用String.TrimEnd like:

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

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

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

    会给你"something"

    如果您只想删除 单个出现", "(末尾的逗号和空格),请使用:

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

    【讨论】:

    • 这也会删除多个尾随逗号/空格,这可能是可取的,但不符合 OP 规定的仅检查最后两个字符的要求。
    • @DanBryant,也为此添加了解决方案。
    【解决方案3】:

    与其删除结尾的逗号和空格,不如简单地生成字符串,而无需首先添加额外的逗号。生成逗号分隔值时,只需使用 String.Join 将所有字符串与特定分隔符连接在一起:

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

    这将比将值附加在一起更容易和更快,并且Join 将已经处理确保没有尾随分隔符。

    【讨论】:

    • @probrandono 试试看。
    • 太棒了!在大多数情况下,聚合将被此替换!谢谢。
    【解决方案4】:

    (对不起,聚会迟到了。)

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

    (.*?)(, )?$
    

    您可以在related regex fiddle 中对其进行测试。

    关键点:

    • (.*?) - 匹配零个或多个 (*) 除换行符 (.) 以外的任何字符尽可能少 (?)。
    • (, )?$ – 匹配零或一 (?) , 在末尾​​em> ($)。

    另外,下面这个模式的 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, ", ", $", "");) 中提出的建议,因为它超级简单;但希望您发现我概述的方法具有启发性。

    【讨论】:

    • 感谢您使用regex 解决问题并提供详细信息。我将您标记为答案,即使我对其进行了一些更改以减少行数,但几乎与@UlugbekUmirov 解决方案一起使用。
    • @scapegoat17:不客气。是的,如果您不寻求突破每一步以获得指导性清晰度,那么缩短它是有必要的。不过,我认为你打错了:Regex.Match(r,"(.*?)(, )?$)").ToString(); 产生一个 ArgumentException 并带有消息 parsing "(.*?)(, )?$)" - Too many )'s。 我想你是什么可能一直在寻找然后是Regex.Match(r,"(.*?)(, )?$").Groups[1].Value
    • 是的,提交后发现就删了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2018-11-20
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多