簡體   English   中英

CamelCase轉換為友好名稱,即Enum常量; 問題?

[英]CamelCase conversion to friendly name, i.e. Enum constants; Problems?

在我對這個問題的回答中 ,我提到我們使用UpperCamelCase解析來獲取未使用Description屬性修飾的枚舉常量的描述,但它很幼稚,並且在所有情況下都不起作用。 我重溫了它,這就是我提出的:

var result = Regex.Replace(camelCasedString, 
                            @"(?<a>(?<!^)[A-Z][a-z])", @" ${a}");
result = Regex.Replace(result,
                            @"(?<a>[a-z])(?<b>[A-Z0-9])", @"${a} ${b}");

第一個替換查找大寫字母,后跟小寫字母,EXCEPT,其中大寫字母是字符串的開頭(以避免必須返回和修剪),並添加前面的空格。 它處理您的基本UpperCamelCase標識符,並領導像FDICInsured這樣的全高級縮寫詞。

第二個替換查找小寫字母后跟一個大寫字母或數字,並在兩者之間插入一個空格。 這是為了處理特殊但常見的中間或尾隨首字母縮略詞或標識符中的數字(除了前導數字,通常在C風格的語言中禁止)。

運行一些基本的單元測試,這兩個組合正確地分隔了以下所有標識符:NoDescription,HasLotsOfWords,AAANoDescription,ThisHasTheAcronymABCInTheMiddle,MyTrailingAcronymID,TheNumber3,IDo3Things,IAmAValueWithSingleLetterWords和Basic(沒有添加任何空格)。

所以,我首先發布這個與其他可能認為有用的人分享,然后再問兩個問題:

  1. 任何人都會看到一個符合常見的CamelCase-ish約定的情況,這種情況不會被正確地分成友好的字符串嗎? 我知道它不會將相鄰的首字母縮略詞(FDICFCUAInsured)分開,重新調整“正確”的像CamedCased類似的首字母縮略詞,或者大寫一個lowerCamelCased標識符的第一個字母(但是那個很容易添加 - result = Regex.Replace(result, "^[az]", m=>m.ToString().ToUpper()); )。 還要別的嗎?

  2. 任何人都可以看到一種方式來做出這樣的陳述,或者更優雅嗎? 我正在尋找組合替換調用,但由於他們對匹配執行兩個不同的事情,因此無法使用這兩個字符串完成。 它們可以組合成一個方法鏈,在String上使用RegexReplace擴展方法,但任何人都可以想到更好嗎?

因此,雖然我同意Hans Passant的觀點,但我不得不說我必須嘗試將其作為扶手椅正則表達式用戶制作一個正則表達式。

(?<a>(?<!^)((?:[A-Z][a-z])|(?:(?<!^[A-Z]+)[A-Z0-9]+(?:(?=[A-Z][a-z])|$))|(?:[0-9]+)))

是我想出來的。 它似乎通過了你在問題中提出的所有測試。

所以

var result = Regex.Replace(camelCasedString, @"(?<a>(?<!^)((?:[A-Z][a-z])|(?:(?<!^[A-Z]+)[A-Z0-9]+(?:(?=[A-Z][a-z])|$))|(?:[0-9]+)))", @" ${a}");

是一次性的嗎?

並不是這直接回答了問題,但為什么不通過采用標准的C#API並將每個類轉換為友好名稱來進行測試? 它需要一些手動驗證,但它會給你一個很好的標准名稱列表進行測試。

讓我們說你遇到的每一個案例都與此有關(你問我們的例子不會然后給我們一些,所以你甚至沒有問題)。

這仍然會將UI與程序化標識符綁定在一起,這將使編程和UI變化變得脆弱。

它仍然假設您的程序將只使用一種語言。 要么你的潛在市場如此之小,只需索引一系列名稱就足夠可擴展(例如,一個客戶定制或內部項目),或者你假設你永遠不會成功,需要可用於其他語言或您首選語言的其他方言。

“好吧,只要我們失敗,它就會起作用”聽起來像平衡設計中的成績?

要么將其編碼為使用資源,要么將其編碼為盲目地傳遞枚舉名稱或使用名稱數組,因為這至少可以在以后修改。

暫無
暫無

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

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