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

时间:2011-11-02 13:06:36

标签: c# .net string .net-2.0

我有以下字符串:0000015700

我需要一个执行以下操作的算法:

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

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

如何在C#中执行此操作?

7 个答案:

答案 0 :(得分:8)

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

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

希望这应该是不言自明的:)

答案 1 :(得分:3)

首先你应该修剪字符串的结尾,然后得到一个必需的子字符串:

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

答案 2 :(得分:3)

据我所知,你想要从右边的0以外的任何东西开始的6位数字。使用正则表达式。

^.*([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);
}

使用此字符串甚至不需要尾随零(也可以使用尾随零而没有尾随零)。

答案 3 :(得分:3)

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*$):后跟零个或多个0 s,$表示字符串的结尾

因为我把最后一位放在(?= )中,引擎知道那些东西必须在那里,但不应该是匹配的一部分;这被称为“积极前瞻”

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

  

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

然后执行string.LastIndexOf

返回的索引的string.substring

答案 6 :(得分:-2)

你可以试试这个: 在for循环中,找到零字符的最后一个索引。如果它与数组的最后一个索引相同,则将其删除。