如何删除C#中字符串中符合模式的尾随数字
本文关键字:模式 数字 字符串 删除 何删除 | 更新日期: 2023-09-27 18:13:31
我有以下字符串:0000015700
我需要一个算法,可以做到以下几点:
- 从右向左转到除
0
之外的第一位(在这种情况下为7
( - 从
7
开始从右向左提取6位数字(输出为000157
它无法使用LINQ实现,因为该项目是在.NET 2.0框架上运行的。
我如何在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*$)
:后面跟零个或多个0
s,$
表示字符串的末尾
因为我把最后一位放在了(?= )
中,所以引擎知道这些东西一定存在,但不应该是匹配的一部分;这被称为"正向前瞻">
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循环中,找到零字符的最后一个索引。如果它与数组的最后一个索引相同,请将其删除。