gpt4 book ai didi

c# - C#条件正则表达式替换和电话格式化

转载 作者:行者123 更新时间:2023-12-03 12:25:30 24 4
gpt4 key购买 nike

有什么办法有条件地进行正则表达式替换吗?这是一个例子。

假设您有一个与电话相对应的号码,没有格式:

5553331234


格式化,它将是

(555)333-1234


但是,我们没有格式化数字,而是要应用格式化。您可以进行简单的正则表达式匹配,并按照以下步骤捕获3组中的每组:

(\d{3})(\d{3})(\d{4})


从那里,您可以做一个简单的正则表达式替换

($2)$3-$4


但是,如果您有扩展名怎么办?也许您有10个以上的标准电话号码:

555333123456789


其中56789将是扩展。在这种情况下,我可以将其与

(\d{3})(\d{3})(\d{4})(\d*)


如果我想格式化它,但仅包含扩展名X,我可以这样做吗?例如,我可以设置替换格式:

($2)$3-$4x$5


但是,如果我这样做,即使没有扩展名,x也会显示出来。是否有一种纯粹使用正则表达式使x有条件显示的方法?本质上,它将是“如果$ 5”存在或“如果$ 5.Length()> 0”。

作为解决方法,我可以在该正则表达式匹配项中包含一个命名组,其中上面的(\ d *)变为

(?<Conditional>\d*)


然后,在代码中,我可以断言名为“ Conditional”的组的长度。但是,我希望有一个纯正则表达式解决方案,不需要任何类似的自定义设置。

最佳答案

看一下Substitutions in Regular Expressions-没有可以让您编写条件语句的替换模式。其他库,例如boost :: regex do provide这样的工具,但是在.NET中却没有。

不过,您得到的是使用回调提供替换项的能力。只需使用lambda:

Regex.Replace(
"555333123456789",
@"(\d{3})(\d{3})(\d{4})(\d+)?",
m => $"({m.Groups[1].Value}){m.Groups[2].Value}-{m.Groups[3].Value}{(m.Groups[4].Success ? $"x{m.Groups[4].Value}" : "")}"
)


是的,我知道这不是一个纯正则表达式解决方案,但是它确实可以做到。请记住,替换实际上不是正则表达式操作,而是匹配后步骤,它确实包含匹配结果,但不涉及正则表达式引擎本身。

关于c# - C#条件正则表达式替换和电话格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com