拆分PascalCase字符串,除了首字母缩略词

时间:2011-12-13 20:06:59

标签: c# regex asp.net-mvc-3 pascalcasing

我有一个需要人类可读的单词列表,例如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();

3 个答案:

答案 0 :(得分:12)

不会[A-Z]+[a-z]*这样做吗?这应匹配一个或多个大写字母,后跟零个或多个小写字母。因此ARBs仍然是一个实体,但CamelCase会被分割为Camel Case

答案 1 :(得分:0)

这个怎么样?

[A-Z][a-z]+|[A-Z]

答案 2 :(得分:0)

包括缩略语的字符串/段落/句子可以转换为人类可读的句子/字符串。 我只是尝试格式化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();
    }
相关问题