【问题标题】:Split a string by capital letters [duplicate]用大写字母拆分字符串[重复]
【发布时间】:2011-05-28 04:49:10
【问题描述】:

可能重复:
Regular expression, split string by capital letter but ignore TLA

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

使用C#,如何巧妙地将字符串拆分为“多字串”?

谢谢!

【问题讨论】:

  • 拆分建议你想要一个字符串数组,但看起来你更想在字符串中插入空格?

标签: c# string


【解决方案1】:

使用这个正则表达式(我忘记了我从哪个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

【讨论】:

  • 非常感谢!你能解释一下正则表达式的不同部分吗?
【解决方案2】:
string[] SplitCamelCase(string source) {
    return Regex.Split(source, @"(?<!^)(?=[A-Z])");
}

示例:

https://dotnetfiddle.net/0DEt5m

【讨论】:

  • 好答案。如果您不想拆分大写缩写,请使用return string.Join(" ", Regex.Split(value, @"(?&lt;!^)(?=[A-Z](?![A-Z]|$))"));
  • 一个旧线程,但我发现这很有用。这是我改编自这个答案的扩展方法:public static string SplitCamelCase(this string input, string delimeter = " ") { return input.Any(char.IsUpper) ? string.Join(delimeter, Regex.Split(input, "(?&lt;!^)(?=[A-Z])")) : input; }。这允许您指定分隔符,并且如果输入字符串不包含任何大写字母,则将在不执行 RegEx 的情况下返回输入字符串。示例用法:var s = myString.SplitCamelCase();var s = myString.SplitCamelCase(" ,");
  • 这拆分了CamelCasepascalCase
【解决方案3】:

您可以遍历字符,并在需要的地方添加空格:

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();

【讨论】:

    【解决方案4】:
        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。

    【讨论】:

      【解决方案5】:
                  string str1 = "SeveralWordsString";
                  string newstring = "";
                  for (int i = 0; i < str1.Length; i++)
                  {
                      if (char.IsUpper(str1[i]))
                          newstring += " ";                    
                      newstring += str1[i].ToString();
                  }
      

      【讨论】:

      • 你真的应该使用StringBuilder 而不是创建大量的字符串。
      • 他也可以只是将结果附加到一个 char 数组中,然后对数组进行字符串化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 2015-03-31
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2018-12-13
      • 2020-03-10
      相关资源
      最近更新 更多