【发布时间】:2016-03-22 05:57:34
【问题描述】:
我一直在使用Split() 方法来拆分字符串。但是,如果您在string.Split() 中为条件设置了一些字符,则此方法有效。看到Uppercase时有什么方法可以拆分字符串吗?
是否可以从一些未分隔的字符串中获取几个单词,例如:
DeleteSensorFromTemplate
结果字符串是这样的:
Delete Sensor From Template
【问题讨论】:
我一直在使用Split() 方法来拆分字符串。但是,如果您在string.Split() 中为条件设置了一些字符,则此方法有效。看到Uppercase时有什么方法可以拆分字符串吗?
是否可以从一些未分隔的字符串中获取几个单词,例如:
DeleteSensorFromTemplate
结果字符串是这样的:
Delete Sensor From Template
【问题讨论】:
string[] split = Regex.Split(str, @"(?<!^)(?=[A-Z])");
【讨论】:
正则表达式的另一种方式:
public static string SplitCamelCase(string input)
{
return System.Text.RegularExpressions.Regex.Replace(input, "([A-Z])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim();
}
【讨论】:
如果您不喜欢 RegEx,而您真的只想插入缺少的空格,这也可以:
public static string InsertSpaceBeforeUpperCase(this string str)
{
var sb = new StringBuilder();
char previousChar = char.MinValue; // Unicode '\0'
foreach (char c in str)
{
if (char.IsUpper(c))
{
// If not the first character and previous character is not a space, insert a space before uppercase
if (sb.Length != 0 && previousChar != ' ')
{
sb.Append(' ');
}
}
sb.Append(c);
previousChar = c;
}
return sb.ToString();
}
【讨论】:
我对此很感兴趣,并提出了一个按大小写拆分的函数,以及将大写字母(它假定后面的任何内容都采用标题大小写)和数字组合在一起。
例子:
输入 -> “TodayIUpdated32UPCCodes”
输出 -> “今天我更新了 32 个 UPC 代码”
代码(请原谅我使用的时髦符号)...
public string[] SplitByCase(this string s) {
var ʀ = new List<string>();
var ᴛ = new StringBuilder();
var previous = SplitByCaseModes.None;
foreach(var ɪ in s) {
SplitByCaseModes mode_ɪ;
if(string.IsNullOrWhiteSpace(ɪ.ToString())) {
mode_ɪ = SplitByCaseModes.WhiteSpace;
} else if("0123456789".Contains(ɪ)) {
mode_ɪ = SplitByCaseModes.Digit;
} else if(ɪ == ɪ.ToString().ToUpper()[0]) {
mode_ɪ = SplitByCaseModes.UpperCase;
} else {
mode_ɪ = SplitByCaseModes.LowerCase;
}
if((previous == SplitByCaseModes.None) || (previous == mode_ɪ)) {
ᴛ.Append(ɪ);
} else if((previous == SplitByCaseModes.UpperCase) && (mode_ɪ == SplitByCaseModes.LowerCase)) {
if(ᴛ.Length > 1) {
ʀ.Add(ᴛ.ToString().Substring(0, ᴛ.Length - 1));
ᴛ.Remove(0, ᴛ.Length - 1);
}
ᴛ.Append(ɪ);
} else {
ʀ.Add(ᴛ.ToString());
ᴛ.Clear();
ᴛ.Append(ɪ);
}
previous = mode_ɪ;
}
if(ᴛ.Length != 0) ʀ.Add(ᴛ.ToString());
return ʀ.ToArray();
}
private enum SplitByCaseModes { None, WhiteSpace, Digit, UpperCase, LowerCase }
【讨论】:
如果您不想使用字符串生成器或 RegEx,这是另一种不同的方式,这是完全可以接受的答案。我只是想提供一个不同的解决方案:
string Split(string input)
{
string result = "";
for (int i = 0; i < input.Length; i++)
{
if (char.IsUpper(input[i]))
{
result += ' ';
}
result += input[i];
}
return result.Trim();
}
【讨论】: