【问题标题】:Replace all but last instance of specified character替换指定字符的最后一个实例以外的所有实例
【发布时间】:2012-08-24 21:00:14
【问题描述】:

如果我有一个类似的字符串

10,000kg crane,21,

我应该如何去掉除最后一个逗号以外的所有逗号

10000kg crane,21?

我认为这是一个正则表达式问题。

【问题讨论】:

  • 所以您希望输出为 10000kg 起重机,21?

标签: regex vb.net


【解决方案1】:

可以通过使用lookahead assertion 使用正则表达式来完成。您想替换后面至少有一个逗号的逗号。唯一会失败的逗号是最后一个逗号。

试试这个:

s = Regex.Replace(s, ",(?=.*?,)", "")

在线查看:ideone

【讨论】:

  • +1,尽管您可能希望在开头添加 (?s),以防字符串包含换行符。
【解决方案2】:

另一种方法,它的执行速度可能比 RegEx 解决方案快得多:

Dim s As String = "10,000kg crane,21"
Dim result As String = New StringBuilder(s).Replace(",", String.Empty, 0,
    s.LastIndexOf(","c)).ToString()

要点是它将所有出现的“,”替换为第一个字符和最后一个“,”的索引之间的空字符串。

我做了一些基准测试,运行这个和the proposed RegEx solution 1,000,000 次;在我的笔记本电脑上,无需编译 RegEx,此解决方案的速度大约快七 (7) 倍。如果你编译 RegEx,它的速度仍然是原来的两倍。

【讨论】:

  • 谢谢 - 这更容易维护。
【解决方案3】:

无正则表达式方法:

Dim text = "10,000kg crane,21"
Dim parts = text.Split(","c).Reverse
Dim result = String.Join("", parts.Skip(1).Reverse) & "," & parts.First

【讨论】:

    【解决方案4】:

    一种更丑陋但有效的替代方法:

        Dim strResult As String = Replace(Mid(strTarget, 1, strTarget.LastIndexOf(",")), ",", String.Empty) & _
                                  Microsoft.VisualBasic.Right(strTarget, Len(strTarget) - strTarget.LastIndexOf(","))
    

    【讨论】:

      猜你喜欢
      • 2016-01-31
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多