我得到了以下内容:
03年1月5日
我需要将其转换为1.5.3
问题是我不仅可以修剪0,因为如果我得到了:
10年1月5日
我需要将其转换为1.5.10
那么,解决这个问题的更好方法是什么?正则表达式?如果是这样,任何正则表达式的例子呢?
答案 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电视”