如何拆分不一致的字符串的一部分



>我有以下字符串:

01-21-27-0000-00-048并且很容易将其拆分,因为每个部分都由一个-分隔,但有时这个字符串表示为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} 而不是更具体的{2},这意味着"正好两个"。例如

(w{2,3})-(w{2})-(w{2})-(d{4})-(d{2})[.-]?(d{3})

让第一段包含两到三位数字或字母,还允许第二和第三段中的字母。

首先规范化字符串。

即,如果您知道最后一部分始终是三个字符,则插入 - 作为倒数第四个字符,然后拆分生成的字符串。在同一行中,将点"."转换为短划线"-"并拆分该字符串。

将所有不是数字的字符替换为 emptyString('')。

然后你的任何字符串都变成这样的格式

012127000000048

现在您可以使用将其划分为 (2, 2, 2, 4, 2, 3) 部分。

最新更新