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

Joh*_*tos 9 regex

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

  1. 1112223333
  2. 11122233334

第一个用于普通电话号码(111) 222-3333,第二个用于带有分机号码的电话号码(111) 222-3333 ext 4

所以我们知道电话号码总是10位数,可能是11.如果它是11,那么我想用第二个版本格式化.

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

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

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

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

  1. 1112223333 > (111) 222-3333 ext(应该是(111) 222-3333(没有"ext"后缀)

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

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

Mig*_*elo 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 : "")}");
Run Code Online (Sandbox Code Playgroud)

或者,如果使用较旧的 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 : ""));
Run Code Online (Sandbox Code Playgroud)

  • 这就是现在使用默认 Regex 类应该完成的方法。 (2认同)