繁体   English   中英

用大写字母分割字符串(某些关键字除外)

[英]Spliting a string by capital letters except for certain keywords

以下函数将字符串拆分为该字符串内找到的任何大写字符。

public static string ToSentence(this string input)
{
   var list = new List<char>();
    for (var i = 0; i < input.ToCharArray().Length; i++)
    {
        var c = input.ToCharArray()[i];
        foreach (char c1 in i > 0 && char.IsUpper(c) ? new[] {' ', c} : new[] {c})
            list.Add(c1);
    }
    return new string(list.ToArray());
}

在我的代码中,此函数与另一个函数一起使用,该函数在代码中检索当前方法的名称。 当方法名称顺序包含多个大写字母时,我发现此功能中断。

例如,如果我有一个名为GetDatabaseIDE()的方法,它将返回为"Get Database IDE"

如何更改ToSentence函数,使其接受不会被拆分的关键字列表(例如, IDE变为IDE )?

为什么不尝试Regex? 演示@ https://dotnetfiddle.net/FsPZ9O
1. ([AZ]+) -匹配所有前导大写字符。
2. ([^AZ])* -后面跟零或更多的不是大写字符的字符。

Regex.Matches("GetDatabaseIDE", @"([A-Z]+)([^A-Z])*").Cast<Match>().Select(m => m.Value);

TakeWhile方法在这里很有用,一旦找到大写字符,就可以采用以下大写字符:

for (var i = 0; i < input.Length; i++)
{
    var c = input[i];
    if(char.IsUpper(c))
    {
        var charsToAdd = input.Skip(i).TakeWhile(char.IsUpper).ToArray();
        if(charsToAdd.Length > 1)
        {
            i += charsToAdd.Length - 1;
        }

        if(i > 0) list.Add(' ');

        list.Add(charsToAdd);
    }
    else 
    {
        list.Add(c);
    }
}

您可以添加要跳过的关键字:

public static string ToSentence(string input)
{
   var list = new List<char>();
    for (var i = 0; i < input.ToCharArray().Length; i++)
    {
            if(input.IndexOf("IDE",i,input.Length-i)==i){
                list.AddRange(" IDE");
                i+=2; 
            }
            else{
                var c = input.ToCharArray()[i];
                foreach (char c1 in i > 0 && char.IsUpper(c) ? new[] {' ', c} : new[] {c})
                list.Add(c1);
            }
     }
    return new string(list.ToArray());
}

在这里

这将对您的示例有效,如果方法名称中包含数字,则必须对其进行调整

using System.Text.RegularExpressions;
public static string GetNiceName(string testString)
{
    var pattern = "([A-Z][a-z]+)|([A-Z]+)";
    var result = new List<string>();
    foreach (Match m in Regex.Matches(testString, pattern))
    {
        result.Add(m.Groups[0].Value);
    }
    return string.Join(" ", result);
}

暂无
暂无

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

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