[英]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.