除数字外,删除所有零

4

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

我接收到的字符串格式类似于“零-字母-零-数字”,不包括“-”,数字始终为整数。以下是一些例子:

"0A055" -> "A55"
"0A050" -> "A50"
"0A500" -> "A500"
"0A0505" -> "A505"
"0055" -> "55"
"0505" -> "505"
"0050" -> "50"

我知道我可以遍历字符串中的字符,并在遇到字母或数字(0之外)时设置标志,但我认为使用正则表达式会更好。如果我将来需要在数据库中使用此算法,正则表达式也会更有帮助。
我尝试了类似于这样的内容,但是我没有得到想要的结果:
Regex r = new Regex(@"[0*([a-zA-Z]*)0*([1-9]*)]");
string result = r.Replace(input, "");

我不太擅长编写正则表达式,如果您能帮忙就太好了。


所以,您的意思是十进制数字吗?小数点是数字的一部分吗? - Jodrell
@ Mentoliptus,是否像您的示例中那样,只有1个或0个字母?即您不会看到0ABC0123吗?此外,每个位置上是否可以有多个零?(只是为了澄清一下。) - AAT
@Jodrell,我进行了编辑并指定没有小数。 - Mentoliptus
@AAT,目前我只收到一个字母的字符串,但这在未来可能会改变。 - Mentoliptus
LikeH和Brad Christie的答案都可以,我能把它们都标记为答案吗?谢谢你们的快速回复! - Mentoliptus
7个回答

3

我不确定使用正则表达式是解决这个问题的最佳方式,但是这个正则表达式可以通过所有测试用例:

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

我不太喜欢使用正则表达式的方法,但我认为我必须在SQL中转移此算法,所以希望能够两次使用相同的正则表达式。 - Mentoliptus
我在nregex.com上测试了这个,它也会去掉末尾的零,所以0A500变成了A5。这是他们的一个bug吗? - Sam Holder
@Sam:可能是JavaScript和.NET实现之间的差异。 - LukeH

2

如果我正确理解您的模式,以下内容应该有效

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


1

像其他一些人一样,我不确定正则表达式在这里是否是最好的选择,但它可以通过测试用例:

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

0

由于看起来你只有一个字母,你可以在该字母上将字符串分为两半。

在左半部分,删除所有的零。

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


1
有一些情况没有字母。 - Wojtek Turowicz
现在是个好主意,但我不生成字符串,而且格式可能会改变。我已经收到了多于一个字母的字符串,但目前这些字符串没有零。 - Mentoliptus

0

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

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

你的匹配结果将包含两个组,字母和数字。取出这两个组的值并将它们连接起来,你就会得到你想要的结果。


0

这是一个Perl的答案,仅供参考

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

0

我不知道在.NET中如何实现正则表达式,所以我会让你使用System.Text.Regularexpressions.Regex (MSDN)中的工具编写正确的代码。

无论如何,这个模式应该可以工作(伪代码):

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

0* 表示零个或多个 0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接