[英]Split PascalCase string except for acronyms
我有一個需要使人類可讀的單詞列表,例如FirstName到First Name,LastName到Last Name,在某些情況下,像ARB這樣的首字母縮略詞保持原樣。 后者最近被引入,並且由於我們的正則表達式返回AR Bs而導致顯示問題。 這就是我們所擁有的,我知道這對於首字母縮略詞是不夠的:
([A-Z][a-z]+)
我在SO和其他網站上找到了能夠使用首字母縮略詞的其他表達式,但是它們適用於首字母縮略詞在字符串中而不是整個字符串的字符串。 我可以做簡單的正則表達式,但這對我的技能來說太棘手了。 我會提供其他測試示例,如果我有它們,但所有字符串工作正常,除了新的ARBs。 謝謝。
更新:這是代碼用法
string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " $1", RegexOptions.Compiled).Trim();
不會[AZ]+[az]*
這樣做嗎? 這應匹配一個或多個大寫字母,后跟零個或多個小寫字母。 因此, ARBs
將保持單一實體,但CamelCase
將分為Camel Case
。
包括縮略語的字符串/段落/句子可以轉換為人類可讀的句子/字符串。 我只是嘗試格式化Pascal Cased字符串,我調查了更多,甚至嘗試將縮略語轉換為可理解的格式。
測試數據 :
輸入: “QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI”
輸出: “QWERTY有些事情可以省略一些事情可能會起作用”
代碼:將輸入字符串傳遞給下面給出的方法。
private static string FormatPascalAndAcronym(string input)
{
var builder = new StringBuilder(input[0].ToString());
if (builder.Length > 0)
{
for (var index = 1; index < input.Length; index++)
{
char prevChar = input[index - 1];
char nextChar = index + 1 < input.Length ? input[index + 1] : '\0';
bool isNextLower = Char.IsLower(nextChar);
bool isNextUpper = Char.IsUpper(nextChar);
bool isPresentUpper = Char.IsUpper(input[index]);
bool isPrevLower = Char.IsLower(prevChar);
bool isPrevUpper = Char.IsUpper(prevChar);
if(!string.IsNullOrWhiteSpace(prevChar.ToString()) &&
((isPrevUpper&& isPresentUpper && isNextLower) ||
(isPrevLower&&isPresentUpper&&isNextLower)||
(isPrevLower&&isPresentUpper&&isNextUpper)))
{
builder.Append(' ');
builder.Append(input[index]);
}
else{
builder.Append(input[index]);
}
}
}
return builder.ToString();
}
這個怎么樣?
[A-Z][a-z]+|[A-Z]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.