除去除数字以外的所有零
本文关键字:数字 | 更新日期: 2023-09-27 18:04:09
我必须删除字符串中的所有零,但我必须保留数字中的零。
我收到的字符串格式类似于"0 -字母- 0 -数字",没有"-",数字总是整数。几个例子:
"0A055" -> "A55"
"0A050" -> "A50"
"0A500" -> "A500"
"0A0505" -> "A505"
"0055" -> "55"
"0505" -> "505"
"0050" -> "50"
我知道我可以遍历字符串中的字符,并在遇到与0不同的字母或数字时设置标志,但我认为使用RegEx会更好。如果我必须在数据库中使用这个算法,RegEx也会更有帮助。
我试过这样做,但我没有得到我想要的结果:
Regex r = new Regex(@"[0*([a-zA-Z]*)0*([1-9]*)]");
string result = r.Replace(input, "");
我不太擅长写RegEx-es,所以如果你可以的话请帮助我。
我不相信正则表达式是解决这个问题的最佳方法,但是这个方法适用于所有的测试用例:
string clean = Regex.Replace(dirty, @"(?<!'d)0+|0+(?!'d|$)", "");
如果我正确理解了你的模式,下面应该可以工作。
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
List<String> samples = new List<String>(new[]{
"0A055","0A050","0A500","0A0505","0055","0505","0050"
});
String re = @"^0*([A-Z]*)0*([1-9]'d*)$";
// iterate over all results
samples.ForEach(n => {
Console.WriteLine("'"{0}'" -> '"{1}'"",
n,
Regex.Replace(n, re, "$1$2")
);
});
}
}
输出如下:
"0A055" -> "A55"
"0A050" -> "A50"
"0A500" -> "A500"
"0A0505" -> "A505"
"0055" -> "55"
"0505" -> "505"
"0050" -> "50"
基本上使用模式来否定所有无关紧要的0,并使用regex替换分组来重新连接"有意义的"数字(以及出现时的字母)。
像其他一些我不确定regex是最好的想法,但这与测试用例:
0+(?=[0-9].)|0(?=[a-zA-z])|(?<=[a-zA-Z])0+
因为你似乎只有一个字母,你可以把这个字符串分成两半。
在左侧部分,修剪所有零。
在右边部分,将其转换为数字,这将删除所有前导零,或者您可以使用TrimStart。
使用regex进行替换将比提取您想要的值困难得多。因此,尝试使用下面的简单正则表达式匹配字符串
0*(?<letter>[A-Z])0*(?<number>'d*)
您的匹配结果将包含两个组,字母和数字。取这两个组的值并将它们相加,就会得到你想要的结果。
这是一个关于它值多少钱的Perl答案
s/0*([a-zA-Z]*)0*([1-9]+0*)/$1$2/g
我不知道regex是如何在。net中实现的,所以我将让您使用system . text . regulareexpressions . regex (MSDN)中的玩具编写适当的代码
无论哪种方式,该模式都应该工作(在伪代码中):
Replace "(0*)(.+)" by "$2"
0*
表示0或多个0
.+
表示除行尾以外的任何字符
$2
表示第二组括号(因此我们简单地丢弃了字符串的(0*
)部分)。