繁体   English   中英

根据大写字母的出现来拆分单词

[英]Splitting words based on the occurrence of capital letter

从我是消费者的外部 API 收到一个字符串类型的类别。

在我们得到的值中,它们有一个共同的格式,就像

  • NewWest(单词以大写字母开头,单词应该中断的地方都会以大写字母继续)。
  • ABC(单词全部大写)

到目前为止,我们正在做的是将这个类别作为输入,并使用这种方法将它们分成多个带有空格的单词

public static string BreakCategoryIntoMultipleWords(string category)
        {
            StringBuilder builder = new StringBuilder();
            string formatedWord = string.Empty;

        if (category.All(c => char.IsUpper(c)))
        {
            formatedWord = category;
        }
        else
        {
            foreach (char c in category)
            {
                if (Char.IsUpper(c) && builder.Length > 0) builder.Append(' ');
                builder.Append(c);
            }
            formatedWord = builder.ToString();
        }
        return formatedWord;
    }

当前方法将为以下输入返回此值

  • ABC(输入)> ABC(输出)
  • 新西部(输入)> 新西部(输出)
  • NewBellCan (输入) > New Bell Can

还有第三种格式已被注意到

  • ABCXyxxx

  • XCVbbbb

  • RRDdddddddvvvv

    所需的 output 是:

  • ABCXyxxx (输入) > ABC Xyxxx (因为大写字母 X 之后所有的字母都是小字母表示单词断了)

  • XCVbbbb (输入) > XC Vbbb (因为大写字母V之后所有的字母都是小字母表示单词已经断了)

  • RRDddddddvvvv (输入) > RR Dddddddvvvv (由于大写字母 D 后所有字母都很小表示单词已损坏)

我应该如何在现有方法中实现这一点,以便所有三种格式都能正常工作。

正则表达式方法: https://dotnetfiddle.net/42gyod

string result = new Regex("(?=[A-Z][a-z])").Replace(input, " ").TrimStart();

正则表达式的解释

  • (?= )积极向前看 - 这匹配匹配之前的字符
  • [AZ][az]匹配一个大写和一个小写字母

所以这会搜索一个大写字母和一个小写字母并在之前插入一个空格 - 请参阅https://regex101.com/r/PCSlOy/1

添加到@fubo 答案,您还可以使用Split并避免TrimStart

var z = string.Join(' ', Regex.Split(s, "(?!^)(?=[A-Z][a-z])"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM