删除除数字以外的所有零

时间:2011-08-02 12:41:07

标签: c# regex

我必须删除字符串中的所有零,但我必须将数字保留为零。

我收到的字符串格式类似于“zeroes-letter-zeroes-number”,没有' - ',数字总是整数。几个例子:

"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不太好,所以如果可以,请帮助我。

7 个答案:

答案 0 :(得分:3)

我不相信正则表达式是解决此问题的最佳方法,但是这个适用于所有测试用例:

string clean = Regex.Replace(dirty, @"(?<!\d)0+|0+(?!\d|$)", "");

答案 1 :(得分:2)

如果我正确理解您的模式,the following should work

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,并使用正则表达式替换分组重新连接“有意义”的数字(以及存在时的字母)。

答案 2 :(得分:1)

和其他一些人一样,我不确定正则表达式是最好的想法,但这适用于测试用例:

0+(?=[0-9].)|0(?=[a-zA-z])|(?<=[a-zA-Z])0+

答案 3 :(得分:0)

由于您似乎只有一个字母,因此您可以在该字母上将字符串分成两半。

在左侧部分,修剪全部零。

在右侧部分,将其转换为数字,这将删除所有前导零或您可以使用TrimStart。

答案 4 :(得分:0)

使用正则表达式进行替换比提取所需的值要困难得多。因此,请尝试使用下面的简单正则表达式匹配字符串

0*(?<letter>[A-Z])0*(?<number>\d*)

您的匹配结果将包含两个组,字母和数字。取两组的价值并追加它们,你就会得到你想要的东西。

答案 5 :(得分:0)

这是一个Perl的答案,它的价值

s/0*([a-zA-Z]*)0*([1-9]+0*)/$1$2/g

答案 6 :(得分:0)

我不知道如何在.net中实现正则表达式,所以我会让你在System.Text.Regularexpressions.Regex (MSDN)

中用玩具写出正确的代码

无论哪种方式,这种模式都应该有效(伪代码):

Replace "(0*)(.+)" by "$2"

0*表示零或更多0

.+表示除行尾之外的任何字符

$2表示第二组括号(因此我们只是丢弃字符串的(0*)部分。)