[英]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}" : "")}"
)
是的,我知道這不是一個純正則表達式解決方案,但它能完成工作。 記住取代是不是一個真正的正則表達式操作,這是相當匹配后的步驟,就會涉及到比賽的結果,但不涉及正則表達式引擎本身。
您可以使用帶有MatchEvaluator
的Regex.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.