拆分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();

拆分PascalCase字符串,首字母缩写除外

[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();
    }