我有以下字符串:
01-21-27-0000-00-048
并且很容易将其拆分,因为每个部分由 a 分隔-
,但有时此字符串表示为01-21-27-0000-00048
,因此拆分它并不容易,因为最后 2 部分组合在一起。我该如何处理?另外,如果是这样的情况呢?01-21-27-0000-00.048
如果有人好奇,这是一个包裹号,它因县而异,一个县可以有 1 种格式,也可以有 100 种格式。
我有以下字符串:
01-21-27-0000-00-048
并且很容易将其拆分,因为每个部分由 a 分隔-
,但有时此字符串表示为01-21-27-0000-00048
,因此拆分它并不容易,因为最后 2 部分组合在一起。我该如何处理?另外,如果是这样的情况呢?01-21-27-0000-00.048
如果有人好奇,这是一个包裹号,它因县而异,一个县可以有 1 种格式,也可以有 100 种格式。
这是使用正则表达式的一个很好的例子。您的字符串匹配以下正则表达式:
(\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,4}
在 regexp 中使用而不是更具体的{2}
,这意味着“正好两个”。例如,
(\w{2,3})-(\w{2})-(\w{2})-(\d{4})-(\d{2})[.-]?(\d{3})
让第一段包含两到三个数字或字母,并且还允许在第二段和第三段中包含字母。
首先规范化字符串。
即,如果您知道最后一部分始终是三个字符,则插入一个 - 作为倒数第四个字符,然后拆分结果字符串。沿着同一行,转换点 '.' 到破折号“-”并拆分该字符串。
用空字符串('')替换所有不是数字的字符。
然后你的任何字符串都变成这样的格式
012127000000048
现在您可以将它分成 (2, 2, 2, 4, 2, 3) 部分。