除去除数字以外的所有零

本文关键字:数字 | 更新日期: 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*)部分)。