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

标签 c# .net regex

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

  • 1112223333
  • 11122233334

  • 第一个是普通电话号码(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/

    相关文章:

    java - DollarSigns 和 StartsWith() java 的问题

    javascript - 正则表达式正负十进制数,逗号分隔

    c# - 带有客户端证书的 WCF 应用程序在一段时间后失败?

    c# - 重定向时授权 header 丢失

    c# - 在不输入 "mono filename.exe"的情况下在 Windows 上运行 Mono 应用程序?

    c# - 维护多个实例的处理顺序

    c# - 找到 UNC 路径的一部分并放入变量?

    php - PHP 中高效的字符串替换

    c# - 如何将VM中的可为空 bool 值绑定(bind)到RadRadioButton

    c# - 为什么未分配的局部变量不自动初始化?