我有以下字符串:
01-21-27-0000-00-048
并且很容易将它拆分,因为每个部分都由-
分隔,但有时这个字符串表示为01-21-27-0000-00048
,因此拆分它并不容易,因为最后两部分组合在一起。我怎么处理这个?此外,它可能是01-21-27-0000-00.048
如果有人好奇,这是一个包裹号码,因县而异,一个县可以有1种格式,或者它们可以有100种格式。
答案 0 :(得分:4)
这是使用正则表达式的一个非常好的案例。您的字符串匹配以下正则表达式:
(\d{2})-(\d{2})-(\d{2})-(\d{4})-(\d{2})[.-]?(\d{3})
将输入与此表达式匹配,并从匹配中收集六组数字:
var str = new[] {
"01-21-27-0000-00048", "01-21-27-0000-00.048", "01-21-27-0000-00-048"
};
foreach (var s in str) {
var m = Regex.Match(s, @"(\d{2})-(\d{2})-(\d{2})-(\d{4})-(\d{2})[.-]?(\d{3})");
for (var i = 1 /* one, not zero */ ; i != m.Groups.Count ; i++) {
Console.Write("{0} ", m.Groups[i]);
}
Console.WriteLine();
}
如果您希望允许其他字符(例如,以短划线分隔的细分中的字母),则可以使用\w
代替\d
来表示字母,数字或下划线。如果您想在已知范围内允许未指定数量的此类字符(例如,两到四个),则可以在正则表达式中使用{2,4}
而不是更具体的{2}
,这意味着“正好两个”。例如,
(\w{2,3})-(\w{2})-(\w{2})-(\d{4})-(\d{2})[.-]?(\d{3})
让第一段包含两到三个数字或字母,并允许第二段和第三段中的字母。
答案 1 :(得分:2)
首先规范化字符串。
即。如果你知道最后一部分总是三个字符,那么插入一个 - 作为倒数第四个字符,然后拆分结果字符串。沿同一行,转换点'。'短划线' - '并拆分该字符串。
答案 2 :(得分:0)
用 emptyString ('')替换所有不是数字的字符。
然后你的任何字符串都会变成像
这样的格式 012127000000048
现在你可以使用它分为(2,2,2,4,2,3)部分。