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

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

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

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}" : "")}"
)

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

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

java split regex-字符的任意组合 - java

我正在使用3个字符分割字符串:空格,破折号和逗号我想要的是能够使用这3个字符的任意组合进行拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts = address.s…

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…