拆分PascalCase字符串,首字母缩写除外
本文关键字:缩写 PascalCase 字符串 拆分 | 更新日期: 2023-09-27 18:17:39
我有一个需要让人可读的单词列表,比如FirstName到FirstName, LastName到LastName,在某些情况下,像arb这样的首字母缩略词保持原样。后者是最近引入的,由于正则表达式返回AR b ,因此导致了显示问题。以下是我们所拥有的,我知道对于首字母缩略词来说是不够的:
([A-Z][a-z]+)
我在SO和其他网站上发现了其他表达式,这些表达式能够使用首字母缩略词,但是它们在字符串上工作,其中首字母缩略词在字符串内而不是整个字符串。我可以做简单的正则表达式,但这对我的技能来说太棘手了。如果我有的话,我会提供其他示例来进行测试,但是除了新的字符串arb之外,所有字符串都工作得很好。谢谢你。
更新:这里是代码使用
string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " $1", RegexOptions.Compiled).Trim();
[A-Z]+[a-z]*
不会这么做吗?它应该匹配一个或多个大写字母,后跟零个或多个小写字母。因此,ARBs
仍然是一个单独的实体,但CamelCase
将分成Camel Case
。
这个怎么样?
[A-Z][a-z]+|[A-Z]
包含缩略词的字符串/段落/句子可以转换为人类可读的句子/字符串。我只是试图格式化Pascal大小写字符串,我调查了更多,甚至试图将缩略词转换为可理解的格式。
测试数据:
输入: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"
输出: "QWERTY某事省略TRY某事可能正在工作"
代码:将输入字符串传递给下面给出的方法。
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();
}