.Net删除字符串中的所有前0位

时间:2010-06-02 14:56:53

标签: c# regex .net-3.5

我得到了以下内容:

03年1月5日

我需要将其转换为1.5.3

问题是我不仅可以修剪0,因为如果我得到了:

10年1月5日

我需要将其转换为1.5.10

那么,解决这个问题的更好方法是什么?正则表达式?如果是这样,任何正则表达式的例子呢?

8 个答案:

答案 0 :(得分:16)

扩展@FrustratedWithFormsDesigner的答案:

string Strip0s(string s)
{
    return string.Join<int>(".", from x in s.Split('.') select int.Parse(x));
}

答案 1 :(得分:15)

正则表达式替换

(?<=^|\.)0+

用空字符串。正则表达式是:

(?<=     # begin positive look-behind (i.e. "a position preceded by")
  ^|\.   #   the start of the string or a literal dot †
)        # end positive look-behind
0+       # one or more "0" characters

†请注意,并非所有正则表达式都支持可变长度的后视,但.NET会支持。

如果你期望这种输入:"00.03.03"并希望在这种情况下保持前导零(如"0.3.3"),请改用此表达式:

(?<=^|\.)0+(?=\d)

再次替换为空字符串。


来自评论(感谢Kobi):有一个更简洁的表达,不需要后视,相当于我的第二个建议:

\b0+(?=\d)

\b       # a word boundary (a position between a word char and a non-word char) 
0+       # one or more "0" characters
(?=\d)   # positive look-ahead: a position that's followed by a digit

这是因为0恰好是单词字符,因此可以使用单词边界来查找行中的第一个0。它是一个更兼容的表达式,因为许多正则表达式不支持可变长度的后视,而有些(如JavaScript)根本没有后视。

答案 2 :(得分:3)

你可以. 0上的字符串,然后修剪分割结果的前导{{1}},然后将它们合并在一起。

我不知道在单个操作中执行此操作的方法,但您可以编写一个隐藏此功能并使其看起来的函数,就像单个操作一样。 ;)

<强>更新

我甚至没有想到另一个人的正则表达式。是的,这可能会在一次操作中完成。

答案 3 :(得分:1)

这是FrustratedWithFormsDesigner建议的另一种方式:

string s = "01.05.10";
string s2 = string.Join(
    ".",
    s.Split('.')
        .Select(str => str.TrimStart('0'))
        .ToArray()
);

这几乎与dtb的答案相同,但不要求子字符串是有效的整数(它也适用于,例如,“000A.007.0HHIMARK”)。

UPDATE :如果您希望输入字符串中包含全部0的任何字符串输出为单个0,您可以使用:

string s2 = string.Join(
    ".",
    s.Split('.')
        .Select(str => TrimLeadingZeros(str))
        .ToArray()
);

public static string TrimLeadingZeros(string text) {
    int number;
    if (int.TryParse(text, out number))
        return number.ToString();
    else
        return text.TrimStart('0');
}

输入/输出示例:

00.00.000A.007.0HHIMARK // input
0.0.A.7.HHIMARK         // output

答案 4 :(得分:1)

还有一种老式的方式,它可能比所提到的大多数其他解决方案具有更好的性能特征。类似的东西:

static public string NormalizeVersionString(string versionString)
{
    if(versionString == null)
       throw new NullArgumentException("versionString");

    bool insideNumber = false;    
    StringBuilder sb = new StringBuilder(versionString.Length);
    foreach(char c in versionString)
    {
        if(c == '.')
        {
            sb.Append('.');
            insideNumber = false;
        }
        else if(c >= '1' && c <= '9')
        {
            sb.Append(c);
            insideNumber = true;
        }
        else if(c == '0')
        {
            if(insideNumber)
                sb.Append('0');
        }
    }
    return sb.ToString();
}

答案 5 :(得分:0)

string s = "01.05.10";
string newS = s.Replace(".0", ".");
newS = newS.StartsWith("0") ? newS.Substring(1, newS.Length - 1) : newS;

Console.WriteLine(newS);

注意:您必须彻底检查可能的输入组合。

答案 6 :(得分:0)

这看起来像是一种日期格式,如果是这样,我会使用日期处理代码

DateTime time = DateTime.Parse("01.02.03");
String newFormat = time.ToString("d.M.yy");

甚至更好

String newFormat = time.ToShortDateString();

这将尊重您和您的客户文化背景。

如果此数据不是日期,则不要使用此:)

答案 7 :(得分:0)

我有一个类似的要求,用街道地址解析一个字符串,其中一些房子号码有前导零,我需要删除它们,同时保持其余的文本完好无损,所以我稍微编辑了接受的答案,以满足我的要求,也许有人发现它很有用。基本上和接受的答案一样,区别在于我正在检查字符串部分是否可以解析为整数,并在false时默认为字符串值;

string Strip0s(string s)
{
    int outputValue;
    return
        string.Join(" ",
            from x in s.Split(new[] { ' ' })
            select int.TryParse(x, out outputValue) ? outputValue.ToString() : x);
}
  

输入:“Islands Brygge 34 B 07 TV”

     

输出:“群岛Brygge 34 B 7电视”