条件正则表达式替换为添加破折号

时间:2018-05-08 13:03:10

标签: c# regex

好的,所以我需要设计一个正则表达式来插入破折号。我的任务是构建一个Web API函数,它根据输入参数返回一个特定格式的字符串。由于某些原因我还没有明确说明,源数据没有正确格式化,我需要在正确的位置用短划线重新格式化数据。

根据前两个字符和字符串长度,有一个可选的第三个破折号。幸运的是,我并不担心这些角色是什么。这个系统是一个passthrough,所以垃圾进去,垃圾出来。但是,我确实需要确保短划线的长度适当。

Structure               Types
XX-9999999999-XX        AB
XX-9999999999-99        CD, EF
XX-9999999999-XXX-99    GH
XX-9999999999-XX-99     IJ, KL

例如:

AB123456789044 should be AB-01234567890-44 and 
GH1234567890YYY99 becomes GH-01234567890-YYY-99.

到目前为止,我已经到了这一步。

^(\w\w)(\d{10})(\w{2,3})(\d\d)?$

导致我的问题

1)我试图用$ 1- $ 2- $ 3- $ 4替换但是,每当有第四个小数部分时,例如IJ的情况,很难在替换中区分它和AB。

我得到了GH-01234567890-YY-99和GH-01234567890-YY - 。

如何在替换字符串中引用条件捕获组,以使与其相关的破折号仅在分组存在时显示?

1 个答案:

答案 0 :(得分:0)

问题是您需要条件替换,而C#不支持这些替换。所以你必须以编程方式进行替换。类似的东西:

string resultString = null;
try {
    Regex regexObj = new Regex(@"([A-Z]{2})-?(\d{10})-?(?:([A-Z]{2,3})|(\d{2}))-?(\d{2})?", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline);
    resultString = regexObj.Replace(subjectString, new MatchEvaluator(ComputeReplacement));
} catch (ArgumentException ex) {
    // Error handling
}

public String ComputeReplacement(Match m) {
    // Vary the replacement text in C# as needed
    return "$1-$2-$3-$4-$5";
}

我并没有过多关注这里的实际RegEx,因为您似乎知道自己在做什么。我刚刚包含了一些条件连字符,以防数据非常脏(部分格式化)。显然你必须编辑这个的“返回”部分,使用条件,以防任何捕获是空白的。我没有为你制定这个逻辑,因为C#不是我的力量。