.NET - 如何将"大写"分隔的字符串拆分为数组?

Mat*_*ino 112 .net regex string algorithm pascalcasing

我如何从这个字符串:"ThisIsMyCapsDelimitedString"

...到这个字符串:"这是我的帽子划分字符串"

VB.net中最少的代码行是首选,但C#也是受欢迎的.

干杯!

Mar*_*rot 170

我刚才做了这个.它匹配CamelCase名称的每个组件.

/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g
Run Code Online (Sandbox Code Playgroud)

例如:

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
"camelCase" => ["camel", "Case"]
Run Code Online (Sandbox Code Playgroud)

要将其转换为仅在单词之间插入空格:

Regex.Replace(s, "([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))", "$1 ")
Run Code Online (Sandbox Code Playgroud)

如果你需要处理数字:

/([A-Z]+(?=$|[A-Z][a-z]|[0-9])|[A-Z]?[a-z]+|[0-9]+)/g

Regex.Replace(s,"([a-z](?=[A-Z]|[0-9])|[A-Z](?=[A-Z][a-z]|[0-9])|[0-9](?=[^0-9]))","$1 ")
Run Code Online (Sandbox Code Playgroud)

  • 实际上camelCase有一个领先的小写字母.你在这里指的是PascalCase. (18认同)
  • ......当你提到可能是"骆驼案"或"帕斯卡案"的东西时,它被称为"跨越" (12认同)

Way*_*yne 36

Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")
Run Code Online (Sandbox Code Playgroud)

  • 这个将连续的大写视为单独的单词(例如ANZAC是5个单词),其中MizardX的答案将它(正确的恕我直言)视为一个单词. (8认同)
  • @Ray,我认为"ANZAC"应该被写为"Anzac",因为它不是英语案例,因此被认为是一个pascal案例. (2认同)

Jos*_*shL 19

很棒的答案,MizardX!我略微调整它以将数字视为单独的单词,因此"AddressLine1"将变为"地址行1"而不是"地址行1":

Regex.Replace(s, "([a-z](?=[A-Z0-9])|[A-Z](?=[A-Z][a-z]))", "$1 ")
Run Code Online (Sandbox Code Playgroud)

  • 太棒了!我怀疑不会有一些人会对接受的答案处理字符串中的数字感到惊讶.:) (2认同)

Tro*_*ard 18

只是为了一点点......这是一个不使用正则表达式的扩展方法.

public static class CamelSpaceExtensions
{
    public static string SpaceCamelCase(this String input)
    {
        return new string(Enumerable.Concat(
            input.Take(1), // No space before initial cap
            InsertSpacesBeforeCaps(input.Skip(1))
        ).ToArray());
    }

    private static IEnumerable<char> InsertSpacesBeforeCaps(IEnumerable<char> input)
    {
        foreach (char c in input)
        {
            if (char.IsUpper(c)) 
            { 
                yield return ' '; 
            }

            yield return c;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Pse*_*ist 11

格兰特瓦格纳的优秀评论不谈:

Dim s As String = RegularExpressions.Regex.Replace("ThisIsMyCapsDelimitedString", "([A-Z])", " $1")
Run Code Online (Sandbox Code Playgroud)


Dan*_*olm 9

我需要一个支持首字母缩略词和数字的解决方案.这个基于正则表达式的解决方案将以下模式视为单个"单词":

  • 大写字母后跟小写字母
  • 一系列连续数字
  • 连续大写字母(解释为首字母缩略词) - 一个新词可以开始使用最后一个大写,例如HTMLGuide =>"HTML Guide","Theateam"=>"A Team"

可以做一个单行:

Regex.Replace(value, @"(?<!^)((?<!\d)\d|(?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z]))", " $1")
Run Code Online (Sandbox Code Playgroud)

更可读的方法可能更好:

using System.Text.RegularExpressions;

namespace Demo
{
    public class IntercappedStringHelper
    {
        private static readonly Regex SeparatorRegex;

        static IntercappedStringHelper()
        {
            const string pattern = @"
                (?<!^) # Not start
                (
                    # Digit, not preceded by another digit
                    (?<!\d)\d 
                    |
                    # Upper-case letter, followed by lower-case letter if
                    # preceded by another upper-case letter, e.g. 'G' in HTMLGuide
                    (?(?<=[A-Z])[A-Z](?=[a-z])|[A-Z])
                )";

            var options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled;

            SeparatorRegex = new Regex(pattern, options);
        }

        public static string SeparateWords(string value, string separator = " ")
        {
            return SeparatorRegex.Replace(value, separator + "$1");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是(XUnit)测试的摘录:

[Theory]
[InlineData("PurchaseOrders", "Purchase-Orders")]
[InlineData("purchaseOrders", "purchase-Orders")]
[InlineData("2Unlimited", "2-Unlimited")]
[InlineData("The2Unlimited", "The-2-Unlimited")]
[InlineData("Unlimited2", "Unlimited-2")]
[InlineData("222Unlimited", "222-Unlimited")]
[InlineData("The222Unlimited", "The-222-Unlimited")]
[InlineData("Unlimited222", "Unlimited-222")]
[InlineData("ATeam", "A-Team")]
[InlineData("TheATeam", "The-A-Team")]
[InlineData("TeamA", "Team-A")]
[InlineData("HTMLGuide", "HTML-Guide")]
[InlineData("TheHTMLGuide", "The-HTML-Guide")]
[InlineData("TheGuideToHTML", "The-Guide-To-HTML")]
[InlineData("HTMLGuide5", "HTML-Guide-5")]
[InlineData("TheHTML5Guide", "The-HTML-5-Guide")]
[InlineData("TheGuideToHTML5", "The-Guide-To-HTML-5")]
[InlineData("TheUKAllStars", "The-UK-All-Stars")]
[InlineData("AllStarsUK", "All-Stars-UK")]
[InlineData("UKAllStars", "UK-All-Stars")]
Run Code Online (Sandbox Code Playgroud)