【发布时间】:2016-02-17 14:59:18
【问题描述】:
假设我有以下 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 编程),但我更想知道 是否有办法更改替换正则表达式本身 是否有某种形式的逻辑,仅当且仅当有第 4 个捕获组时才添加后缀 ext $4?
【问题讨论】:
-
@JohnBustos 正则表达式引擎不会替换,它只会匹配。替换是语言/工具功能的一部分。
-
在 .NET 中,您没有条件替换模式支持。在
Regex.Replace中使用回调。抱歉,这是正确的答案。 -
检查是否可以安装 .NET 的 Boost 库。那么,你可以这样做。或 PCRE2(最新版本)。请注意,Notepad++ 可以做到这一点:) 试试
(?<f>\d{3})(?<s>\d{3})(?<t>\d{4})(?<e>\d)?->(?{e}\($+{f}\) $+{s}-$+{t} ext $+{e}:\($+{f}\) $+{s}-$+{t}) -
或者只是do two replaces:
string txt = Regex.Replace(Regex.Replace(phone, @"(^\d{10})(\d)", "$1 ext $2"), @"(\d{3})(\d{3})(\d{4})", "($1) $2-$3");