簡體   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