2013-06-20 52 views
2

如何用相應的帕斯卡案例版本替換全部大寫字符串?舉例來說,如果我有這些字符串:使用正則表達式替換大寫字母與帕斯卡案例

SOMETHING_COOL SOMETHING_LESS_COOL WHATEV

我想這樣的輸出:

SomethingCool SomethingLessCool Whatev

我能走到今天與正則表達式:

^*public\s[\w-]+?(\?)?\s[A-Z]+?(_[A-Z]+)?(_[A-Z]+)? { get; set; } 

。 ..我認爲它適用於我需要的所有情況。真正的問題是如何用相應的帕斯卡案例取代匹配。

編輯:我將使用.NET/C#尋找文件

+1

您正在使用什麼語言或工具? –

+0

你從哪裏得到這些字符串?一份文件?用戶輸入? –

+0

@ F.J看起來像C#,它試圖匹配,所以可能對於正則表達式 –

回答

1

的標識符的Pascal大小寫一旦你匹配的話,你可以使用另一個正則表達式。

我已經改變了原來的正則表達式所以它使用了期待和向後只捕獲標識符匹配

此代碼需要一些C#代碼與時髦的命名方案,並與帕斯卡外殼代碼替換它: -

var code = "public class Blah\r\n public int SOMETHING_LESS_COOL { get; set; }\r\n }"; 
var identifierRegex = new Regex(@"(?<=^\s*public\s[\w-]+?(\?)?\s)[A-Z]+(_[A-Z]+)*(?=\s*\{\s*get;\s*set;\s*\})", RegexOptions.Multiline);   
var underscoreRegex = new Regex(@"(_|\s|^)\w");   
var pascalCode = identifierRegex.Replace(code, 
     i => underscoreRegex.Replace(i.Value.ToLower(), 
          m => m.Value.ToUpper().Replace("_",""))); 

雖然這會更改聲明,但它不會替換使用這些屬性的任何代碼。所以你會留下一些清理工作。可能很有趣,看看你是否可以編寫視覺工作室來做「重命名」重構。

+0

如果您使用'var',那麼您使用的是線內代碼。如果你在線使用代碼,你的概率不應該使用'RegexOptions.Compiled'。看到這個[這個問題和答案](http://stackoverflow.com/questions/513412/how-does-regexoptions-compiled-work)一些性能數字 –

+0

@ScottChamberlain肯定,但如果他把它建成一個類, d更期望預先設置正則表達式,然後他將遍歷他的文件進行替換... –

+0

@ScottChamberlain將它們作爲片段...有助於減少代碼混亂! –

0

有一個字符串變量的標識,嘗試following

var parts = identifier.Split('_'); 
var pascalCasedParts = parts.Select(p => p[0] + 
          new string(p.ToLower().Skip(1).ToArray())); 
var pascalIdent = string.Join("", pascalCasedParts.ToArray()); 
相關問題