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