我得到了以下内容:
01.05.03
我需要将其转换为1.5.3
问题在于我不能只裁剪0,因为如果我得到:
01.05.10
我需要将其转换为1.5.10
那么怎样更好地解决这个问题呢?是使用正则表达式吗?如果是,有没有做到这一点的正则表达式示例?
扩展 @FrustratedWithFormsDesigner 的答案:
string Strip0s(string s)
{
return string.Join<int>(".", from x in s.Split('.') select int.Parse(x));
}
"00.03.03"
的情况(可能会出现,也可能不会出现)。 - Tomalak正则表达式替换
(?<=^|\.)0+
使用空字符串。正则表达式如下:
(?<= # 开始正向先行断言(即“由...前导的位置”) ^|\. # 字符串的开头或一个字面点 † ) # 结束正向先行断言 0+ # 一个或多个字符“0”
† 注意,并非所有的正则表达式支持变长后行断言,但 .NET 支持。
如果您期望此类输入:"00.03.03"
并希望在这种情况下保留前导零(如"0.3.3"
),请改用以下表达式:(?<=^|\.)0+(?=\d)
并再次替换为空字符串。
来自评论(感谢Kobi):有一个更简练的表达式,不需要使用回顾断言,等价于我的第二个建议:
\b0+(?=\d)
这段代码的作用是
\b # 一个单词边界(在一个单词字符和非单词字符之间的位置) 0+ # 一个或多个“0”字符 (?=\d) # 正向先行断言:一个紧跟着数字的位置
它有效的原因是因为 0
恰好是一个单词字符,所以可以使用单词边界来找到连续一串中的第一个0
。这样的表达式更加兼容,因为许多正则表达式不支持可变长度后行断言,并且有些语言(如 JavaScript)根本不支持后行断言。
\b0+(?=\d)
在这里也可以很好地工作,并保持单个零。 - Kobi/* 删除构建号前导零 */
。 - Tomalak这里是另一种实现 FrustratedWithFormsDesigner 建议的方法:
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
int.Parse
之前的解决方案。当某个部分完全由'0'
字符组成时,例如"03.00.10"
,它会失败。 - dtb还有一种老派的方法,可能比其他提到的解决方案具有更好的性能特征。类似这样:
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 s = "01.05.10";
string newS = s.Replace(".0", ".");
newS = newS.StartsWith("0") ? newS.Substring(1, newS.Length - 1) : newS;
Console.WriteLine(newS);
注意:您需要彻底检查可能的输入组合。
001.00005.10
,但他没有说明是否可能。 - FrustratedWithFormsDesigner这看起来像是一个日期格式,如果是的话,我会使用日期处理代码
DateTime time = DateTime.Parse("01.02.03");
String newFormat = time.ToString("d.M.yy");
String newFormat = time.ToShortDateString();
它将尊重您和您客户的文化设置。
如果这个数据不是一个日期,那就别用它 :)
string Strip0s(string s)
{
int outputValue;
return
string.Join(" ",
from x in s.Split(new[] { ' ' })
select int.TryParse(x, out outputValue) ? outputValue.ToString() : x);
}