正则表达式 - 如果捕获的组存在,则有条件替换

时间:2016-02-17 14:59:18

标签: regex

假设我有以下2个代表电话号码的字符串:

  1. 1112223333
  2. 11122233334
  3. 第一个是普通电话号码(111) 222-3333,第二个是电话号码,分机号为(111) 222-3333 ext 4

    所以我们知道电话号码总是10位数,可能是11位。如果是11位,那我就喜欢用第二个版本格式化了。

    我目前的正则表达式和替换如下:

    正则表达式: (\d{3})(\d{3})(\d{4})(\d?)

    替换 ($1) $2-$3 ext $4

    哪个有效,除了无论第四个捕获组是否存在,我都会得到"分机"加入,所以我得到:

    1. 1112223333> (111) 222-3333 ext(应该是(111) 222-3333(不是"分机"后缀)

    2. 11122233334> (111) 222-3333 ext 4(正确)

    3. 我知道我可以通过代码/评估匹配(我在C#/ .Net中编程)来做到这一点,但我更好奇地知道是否有办法更改替换正则表达式本身有某种形式的逻辑,只有当有第四个捕获组时才添加后缀ext $4

1 个答案:

答案 0 :(得分: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 : ""));