2011-04-07 51 views
3

我正在構建一個使用可配置正則表列表來轉換輸入文本的.NET文本格式組件。我需要允許使用正則表達式規則進行大小寫轉換,但我似乎無法弄清楚如何在.NET中執行此操作。 perl風格的替換表達式,例如s /(\ b)([a-z])/ \ 1 \ u \ 2/g可以做到這一點,但.NET似乎不支持它。我知道我可以使用MatchEvaluator與委託,但我需要我的替換規則可配置(文本)。如何在.NET中使用perl樣式替換表達式

任何幫助,將不勝感激。

回答

3

最.NET樣式的方法是

var regex = new Regex(@"^(?<first>.*?):(?<second>.*)$", RegexOptions.Compiled); 
Console.WriteLine(regex.Replace("moon:glow", "${second}:${first}")); 

將打印

glow:moon 

您還可以使用順序引用,就像這樣:

Console.WriteLine(regex.Replace("moon:glow", "$2:$1")); 

混業經營是確定。

相反對Perl你可以單獨檢索所有匹配的值反覆原子,像例如: -

var regex = new Regex(@"^((?<token>.*?):)*", RegexOptions.Compiled); 
foreach (Capture token in regex 
     .Match("moon:glow:is:the most:beautiful:thing") 
     .Groups["token"].Captures) 
    Console.WriteLine(token.Value); 

輸出

moon 
glow 
is 
the most 
beautiful 

爲了獲得先進的匹配評估,你會做如

var upper = Regex.Replace("moon:glow:is:the most:beautiful:thing", "(.*?)(:|$)",     
    m => m.Groups[1].Value.ToUpper() + m.Groups[2]); 
Console.WriteLine(upper); 

不幸的是,我看不出有什麼簡單的方法來配置這樣的評價函數爲純文本(使用編譯器作爲一種服務,這是我所知道的是可在單聲道時除外,但我不是在MS十分肯定。淨尚未)

+0

OP應該如何將其轉換爲通用的方式來接受他的應用程序中的用戶定義的替換定義。你的例子做了一個開關。他的例子修改案例。 – 2011-04-07 20:57:13

+0

錯過了。新增 – sehe 2011-04-07 21:09:49

+0

+1與OP一樣,您也不認爲提供一個用戶界面來替代將由C#RegEx執行的替換的通用規範是非常簡單的。 – 2011-04-07 21:30:09

相關問題