【发布时间】:2011-05-28 04:49:10
【问题描述】:
可能重复:
Regular expression, split string by capital letter but ignore TLA
我有一个字符串,它是几个单词的组合,每个单词都大写。
例如:几个字串
使用C#,如何巧妙地将字符串拆分为“多字串”?
谢谢!
【问题讨论】:
-
拆分建议你想要一个字符串数组,但看起来你更想在字符串中插入空格?
可能重复:
Regular expression, split string by capital letter but ignore TLA
我有一个字符串,它是几个单词的组合,每个单词都大写。
例如:几个字串
使用C#,如何巧妙地将字符串拆分为“多字串”?
谢谢!
【问题讨论】:
使用这个正则表达式(我忘记了我从哪个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
[编辑]
我现在找到了:How do I convert CamelCase into human-readable names in Java?
很好地拆分“TodayILiveInTheUSAWithSimon”,“Today”前面没有空格:
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[] SplitCamelCase(string source) {
return Regex.Split(source, @"(?<!^)(?=[A-Z])");
}
示例:
【讨论】:
return string.Join(" ", Regex.Split(value, @"(?<!^)(?=[A-Z](?![A-Z]|$))"));。
public static string SplitCamelCase(this string input, string delimeter = " ") { return input.Any(char.IsUpper) ? string.Join(delimeter, Regex.Split(input, "(?<!^)(?=[A-Z])")) : input; }。这允许您指定分隔符,并且如果输入字符串不包含任何大写字母,则将在不执行 RegEx 的情况下返回输入字符串。示例用法:var s = myString.SplitCamelCase(); 或 var s = myString.SplitCamelCase(" ,");
CamelCase 和pascalCase
您可以遍历字符,并在需要的地方添加空格:
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();
【讨论】:
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。
【讨论】:
string str1 = "SeveralWordsString";
string newstring = "";
for (int i = 0; i < str1.Length; i++)
{
if (char.IsUpper(str1[i]))
newstring += " ";
newstring += str1[i].ToString();
}
【讨论】:
StringBuilder 而不是创建大量的字符串。