我有以下字符串:0000015700
我需要一个执行以下操作的算法:
0
以外的第一个数字(在这种情况下为7
)7
开始从右向左提取6位数(输出为000157
无法使用LINQ实现,因为该项目在.NET 2.0框架上运行。
如何在C#中执行此操作?
答案 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从右到左查找第一个非零数字,请参阅下面的示例:
然后执行string.LastIndexOf
返回的索引的string.substring答案 6 :(得分:-2)
你可以试试这个: 在for循环中,找到零字符的最后一个索引。如果它与数组的最后一个索引相同,则将其删除。