我正在尋找一種方式來使用正則表達式從兩個不同的表情的捕捉組,並將其用於搜索,並在一個單一的字符串替換與捕捉共享兩次替換之間。使用RegEx.Replace從兩個表達式替換捕捉比賽
例如:
string input_a = "abc-def-ghi";
string input_b = "123-4567-89";
string pattern_a = "(?<first>def)"; // captures 'def' from input_a and
// names the capture as 'first'
string pattern_b = "(?<second>456)"; // captures '456' from input_b and
// names the capture as 'second'
string translation_a = "A=${first}${second}"; // replacement strings use the named
string translation_b = "B=${second}${first}"; // captures from both RegExs
// I want the results of the replace to give:
Console.Write("Result A: abc-A=def456-ghi"); // result of regex search and replace
// matches on 'def' and replaces this
// with 'A=' followed by 'def' from the
// first expression and '456' from the
// second expression
Console.Write("Result B: 123-B=456def-789"); // same thing again but the other way
// around
我的輸入/圖案/翻譯都在運行時不會被稱爲它們是用戶可配置的,並存儲在數據庫中。
任何人都可以提出一個整潔優雅的方式來做到這一點?
UPDATE
爲了讓多一點背景下我的問題,這裏是一個活生生的例子。我在處理傳入呼叫的電信系統中使用它。在呼叫進入時,它們有兩個信息:撥號號碼(在DDI處已知)和呼叫號碼(稱爲CLI)。
我使用存儲在數據庫中,這實際上是一組正則表達式的「規則」列表中創建一個非常動態的配置方式需要路由號碼系統。規則需要通過GUI進行更新,所以任何東西都不能進行硬編碼。
系統的這部分確實對來電一種預路由翻譯。一些例子包括(這是所有虛擬數據):
DDI CLI
80
415080
123402077000000 01373000003
我需要調用「對方出來」與他們的DDI和CLI翻譯。我的數據庫包含:DDISearchPattern,DDITranslation,CLISearchPattern,CLITranslation。
我的第一個簡單的規則就是:
DDISearchPattern = "^0?(?<ddi>\d{9})$"
DDITranslation = "0${ddi}"
CLISearchPattern = "^0?(?<cli>\d{9})$"
CLITranslation = "0${cli}"
有時使人擊中系統中缺少的前導零。這條規則將重新添加。
下一條規則是去除415前綴。
DDISearchPattern = "^4150?(?<ddi>\d{9})$"
DDITranslation = "0${ddi}"
CLISearchPattern = "^0?(?<cli>\d{9})$"
CLITranslation = "0${cli}"
但這是我的問題。在最後一個例子(DDI = 1234020.77億)我要追加CLI將DDI結束,所以我想結束了12340207700000001373000001.
我希望能夠做到這一點:
DDISearchPattern = "^12340?(?<ddi?\d{9})$"
DDITranslation = "12340${ddi}${cli}"
CLISearchPattern = "^0?(?<cli>\d{9})$"
CLITranslation = "0${cli}"
但不幸的是,${cli}
捕獲組是正則表達式CLI,而不是DDI正則表達式的一部分。我怎樣才能從另一個正則表達式中加載一個正則表達式來捕獲這些正則表達式,這樣我就可以使用這兩種捕獲方式進行替換了?
我已經找到一種方法來做到這一點,但它的使用正則表達式來替換@'\$\{cli\}'
一個非常混亂的方式。我真的想找到更簡單更好的方法。
它是如何「一個字符串」如果你有兩個輸入字符串,兩名翻譯字符串和兩個輸出字符串?我想你已經知道你可以保存結果並使用'String.Format'來構建字符串。唯一可以結合的是正則表達式到'(? def)|(? 456)',但這是毫無意義的。我不認爲我很理解你的問題...... –
Kobi
2011-03-02 21:38:06
@Kobi:也許我應該稍微重新說一遍,以使其更清晰。通過單個字符串,我的意思是將來自兩個表達式的捕獲進行組合並且可用於搜索並替換爲另一個「單個」字符串。我的例子只是表明這發生了兩次,因此有兩個結果。 – BG100 2011-03-02 21:43:39