C# .Net正在删除字符串的所有前0

C# .Net正在删除字符串的所有前0,c#,regex,.net-3.5,C#,Regex,.net 3.5,我得到以下信息: 01.05.03 我需要把它转换成1.5.3 问题是我不能只修剪0,因为如果我得到: 01.05.10 我需要把它转换成1.5.10 那么,解决这个问题的更好方法是什么?正则表达式?如果是这样的话,任何这样做的正则表达式示例?您可以打开字符串,然后修剪拆分结果的前导0,然后将它们合并在一起 我不知道如何在单个操作中实现这一点,但您可以编写一个函数来隐藏它,并使其看起来像单个操作 更新: 我甚至没想到另一个人的正则表达式。是的,一次手术就可以了 Regex替换 (?<=^|

我得到以下信息:

01.05.03

我需要把它转换成1.5.3

问题是我不能只修剪0,因为如果我得到:

01.05.10

我需要把它转换成1.5.10

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

您可以打开字符串,然后修剪拆分结果的前导0,然后将它们合并在一起

我不知道如何在单个操作中实现这一点,但您可以编写一个函数来隐藏它,并使其看起来像单个操作

更新:

我甚至没想到另一个人的正则表达式。是的,一次手术就可以了

Regex替换

(?<=^|\.)0+
并再次替换为空字符串

从评论中感谢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。它是一个更兼容的表达式,因为许多正则表达式风格不支持可变长度的lookbehind,而一些类似JavaScript的风格根本不支持lookbehind

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

Console.WriteLine(newS);

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

扩展@fructedWithFormsDesigner的答案:

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

下面是另一种方法,您可以按照FrustedWithFormsDesigner的建议:

string s = "01.05.10";
string s2 = string.Join(
    ".",
    s.Split('.')
        .Select(str => str.TrimStart('0'))
        .ToArray()
);
这与dtb的答案几乎相同,但不要求子字符串是它也可以使用的有效整数,例如000A.007.0HHIMARK

更新:如果希望将输入字符串中所有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

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

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

String newFormat = time.ToShortDateString();
这将尊重你和你的客户的文化背景


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

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

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();
}

我有一个类似的要求来解析带有街道地址的字符串,其中一些门牌号有前导零,我需要删除它们,同时保持其余文本的完整性,所以我稍微编辑了接受的答案以满足我的要求,也许有人会觉得它有用。基本上做的和accepted answer相同,不同的是我检查字符串部分是否可以被解析为整数,如果为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电视

输出:Islands Brygge 34 B 7电视


你正在尝试格式化日期吗?有比正则表达式更好的方法来实现这一点。不,这不是一个日期,而是一个层次结构级别。你能给我一个用replace实现这一点的c代码示例吗?@Melurus:不,因为这很容易找到。官方文档和无数的网站,包括Stack Overflow本身,可以为您提供一个如何在.NET中使用正则表达式的示例。\b0+?=\d在这里也可以很好地工作,并保持一个零。@Kobi:很好的捕获,这比我的查找还要好。如果他有001.00005.10,这可能不起作用,但他没有具体说明这是否可行。+1是为了便于读取生成的代码,而不是需要一个正则表达式comments@Miki瓦茨:嗯,正则表达式解决方案只需要split/loop/join变量:/*删除内部版本号*/.+1上的前导零即可将其Linq化!我总是忘记这样做是可能的。+1很好的替代方案,尽管它不处理00.03.03的情况,这可能会发生,也可能不会发生。这是我在将其更改为int.Parse之前的解决方案。当一个部件完全由“0”字符组成时,它会失败,例如03.00.10。@dtb:失败是什么意思?我不知道OP在哪里指定了在这种情况下应该发生什么。如果要删除尾随零,我会认为03.00.10的输出应该是03..10,就是这样。否则,OP将需要提供稍微更详细的要求,除非我遗漏了什么。抱歉,遗漏了评论。按OP
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();
}
string Strip0s(string s)
{
    int outputValue;
    return
        string.Join(" ",
            from x in s.Split(new[] { ' ' })
            select int.TryParse(x, out outputValue) ? outputValue.ToString() : x);
}