好的,所以我需要设计一个正则表达式来插入破折号。我的任务是构建一个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 - 。
如何在替换字符串中引用条件捕获组,以使与其相关的破折号仅在分组存在时显示?
答案 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#不是我的力量。