如何删除C#中字符串中符合模式的尾随数字

本文关键字:模式 数字 字符串 删除 何删除 | 更新日期: 2023-09-27 18:13:31

我有以下字符串:0000015700

我需要一个算法,可以做到以下几点:

  • 从右向左转到除0之外的第一位(在这种情况下为7(
  • 7开始从右向左提取6位数字(输出为000157

它无法使用LINQ实现,因为该项目是在.NET 2.0框架上运行的。

我如何在C#中做到这一点?

如何删除C#中字符串中符合模式的尾随数字

如果你不太关心性能,并且你有LINQ,你可以做:

var result = new string(text.Reverse()
                            .SkipWhile(c => c == '0')
                            .Take(6)
                            .Reverse()
                            .ToArray());

希望这应该是非常不言自明的:(

首先应该修剪字符串的末尾,然后获得所需的子字符串:

var tmp = str.TrimEnd('0');
var result = tmp.Substring(Math.Max(0,tmp.Length - 6));

因此,据我所知,您希望6位数字从右侧0以外的任何数字开始。使用正则表达式。

^.*([0-9]{5}[1-9])0*$

我没有C#的经验,但看起来这应该有效:

using System.Text.RegularExpressions;
[...]
Match match = Regex.Match(input, @"^.*([0-9]{5}[1-9])0*$", RegexOptions.IgnoreCase);
// Here we check the Match instance.
if (match.Success)
{
    // Finally, we get the Group value and display it.
    string key = match.Groups[1].Value;
    Console.WriteLine(key);
}

这样,字符串甚至不需要有尾随零(在没有尾随零的情况下也可以使用尾随零(。

using System.Text.RegularExpressions;
…   
var source = "0000015700";
var pattern = @"'d{5}[1-9](?=0*$)";
var result = Regex.Match(source, pattern);
if(result.Success)
{
    Console.WriteLine(result.Groups[0]);
}

如果您不熟悉正则表达式,它是一种用于字符串模式匹配的语言,几乎嵌入到所有通用编程语言中。上面的模式将匹配您的输入字符串,如果:

'd{5}:您有5个连续数字
[1-9]:后跟1到9之间的任意数字(非零(
(?=0*$):后面跟零个或多个0s,$表示字符串的末尾

因为我把最后一位放在了(?= )中,所以引擎知道这些东西一定存在,但不应该是匹配的一部分;这被称为"正向前瞻">

string input = "0000015700";
string result = new string(
    input.Reverse()
            .SkipWhile(ch => ch == '0')
            .Take(6)
            .Reverse()
            .ToArray());

使用字符串。LastIndexOf从右到左查找第一个非零数字,请参阅下面的示例:

http://msdn.microsoft.com/en-us/library/ms224422.aspx

然后对字符串返回的索引执行string.substring。的最后索引

您可以尝试以下操作:在for循环中,找到零字符的最后一个索引。如果它与数组的最后一个索引相同,请将其删除。