用大写字母分割字符串

可能的复制品:
正则表达式,按大写字母分割字符串,但忽略 TLA

我有一个由几个单词组成的字符串,每个单词都是大写的。
例如: SeveralWordsString

使用 C # ,如何巧妙地将字符串分割成“几个单词字符串”?

谢谢!

64018 次浏览

您可以只是循环通过字符,并在需要的地方添加空格:

string theString = "SeveralWordsString";


StringBuilder builder = new StringBuilder();
foreach (char c in theString) {
if (Char.IsUpper(c) && builder.Length > 0) builder.Append(' ');
builder.Append(c);
}
theString = builder.ToString();
string[] SplitCamelCase(string source) {
return Regex.Split(source, @"(?<!^)(?=[A-Z])");
}

样本:

Https://dotnetfiddle.net/0det5m

使用这个 regex (我忘了我是从哪个 stackoverflow 答案获得它的,现在将搜索它) :

 public static string ToLowercaseNamingConvention(this string s, bool toLowercase)
{
if (toLowercase)
{
var r = new Regex(@"
(?<=[A-Z])(?=[A-Z][a-z]) |
(?<=[^A-Z])(?=[A-Z]) |
(?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);


return r.Replace(s, "_").ToLower();
}
else
return s;
}

我在这个项目中使用它: http://www.ienablemuch.com/2010/12/intelligent-brownfield-mapping-system.html

[编辑]

我现在找到了: 如何在 Java 中将 CamelCase 转换为人类可读的名称?

把“今天我在美国和西蒙一起生活”很好地分开,在“今天”前面没有空格:

using System;
using System.Text.RegularExpressions;


namespace TestSplit
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!");






var r = new Regex(@"
(?<=[A-Z])(?=[A-Z][a-z]) |
(?<=[^A-Z])(?=[A-Z]) |
(?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);




string s = "TodayILiveInTheUSAWithSimon";
Console.WriteLine( "YYY{0}ZZZ", r.Replace(s, " "));
}
}
}

产出:

 YYYToday I Live In The USA With SimonZZZ
            string str1 = "SeveralWordsString";
string newstring = "";
for (int i = 0; i < str1.Length; i++)
{
if (char.IsUpper(str1[i]))
newstring += " ";
newstring += str1[i].ToString();
}
    public static IEnumerable<string> SplitOnCapitals(string text)
{
Regex regex = new Regex(@"\p{Lu}\p{Ll}*");
foreach (Match match in regex.Matches(text))
{
yield return match.Value;
}
}

这将正确处理 Unicode。