簡體   English   中英

C#條件正則表達式替換和電話格式化

[英]C# conditional regex replace and phone formatting

有什么辦法有條件地進行正則表達式替換嗎? 這是一個例子。

假設您有一個與電話相對應的號碼,沒有格式:

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”的組的長度。 但是,我希望有一個純正則表達式解決方案,不需要任何類似的自定義設置。

看一下正則表達式中的替換-沒有可讓您編寫條件的替換模式。 其他庫,例如boost :: regex 確實提供了此類功能,但是您在.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}" : "")}"
)

是的,我知道這不是一個純正則表達式解決方案,但它能完成工作。 記住取代不是一個真正的正則表達式操作,這是相當匹配后的步驟,就會涉及到比賽的結果,但涉及正則表達式引擎本身。

您可以使用帶有MatchEvaluatorRegex.Replace重載,該重載將允許您基於匹配的組執行條件邏輯。

var phone = "5553331234";
Regex phoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(\d*)");
var formatted = phoneRegex.Replace(
    phone, 
    m => string.Format(
        "({0}){1}-{2}{3}{4}", 
        m.Groups[1].Value, 
        m.Groups[2].Value, 
        m.Groups[3].Value, 
        m.Groups[4].Value.Length > 0 ? "x" : string.Empty, 
        m.Groups[4].Value));
Console.WriteLine(formatted);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM