假设我有以下 2 个字符串代表电话号码:
第一个是普通电话号码
(111) 222-3333
第二个是带有分机号的电话号码 (111) 222-3333 ext 4
所以我们知道电话号码总是 10 位数字,也可能是 11 位数字。如果是 11 位,那么我希望将其格式化为第二个版本。
我当前的正则表达式和替换如下:
正则表达式:
(\d{3})(\d{3})(\d{4})(\d?)
更换:
($1) $2-$3 ext $4
哪个有效,除了不管第 4 个捕获组是否存在,我都会添加“ext”,所以我得到:
1112223333
> (111) 222-3333 ext
(应该是 (111) 222-3333
(没有“ext”后缀)11122233334
> (111) 222-3333 ext 4
(正确)我知道我可以通过代码/评估匹配来做到这一点(我在 C#/.Net 中编程),但我更想知道是否有办法更改替换正则表达式本身以具有某种形式的逻辑来只添加后缀
ext $4
当且仅当有第四个捕获组?
最佳答案
好吧,我能得到的最接近的是使用匹配评估器重载和 C# 6 字符串插值。
使用 C# 6 字符串插值的示例:
var phone = "01234567894";
var txt = Regex.Replace(
phone,
@"^(\d{3})(\d{3})(\d{4})(\d?)$",
m => $"({m.Groups[1]}) {m.Groups[2]}-{m.Groups[3]}{(m.Groups[4].Success ? " ext " + m.Groups[4].Value : "")}");
或者,如果使用较旧的 C#,请使用
String.Format
:var phone = "01234567894";
var txt = Regex.Replace(
phone,
@"^(\d{3})(\d{3})(\d{4})(\d?)$",
m => String.Format("({0}) {1}-{2}{3}", m.Groups[1], m.Groups[2], m.Groups[3],
m.Groups[4].Success ? " ext " + m.Groups[4].Value : ""));
关于c# - 正则表达式 - 如果存在捕获的组,则条件替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35460182/