c#字符串-拆分Pascal大小写

本文关键字:Pascal 大小写 拆分 字符串 | 更新日期: 2023-09-27 18:25:28

我一直在尝试获得一个C#regex命令来打开类似的东西

EYDLessThan5Days

进入

EYD Less Than 5 Days

有什么想法吗?

我使用的代码:

public static string SplitPascalCase(this string value) {
    Regex NameExpression = new Regex("([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z0-9]+)",
                                     RegexOptions.Compiled);
    return NameExpression.Replace(value, " $1").Trim();
}

输出:

EYD Less Than5 Days

但还是给了我错误的结果。

事实上,我已经在javascript代码中询问过这一点,但当我用相同逻辑在c#代码中实现时,它失败了。

请帮帮我。谢谢。

c#字符串-拆分Pascal大小写

在正则表达式中使用查找,这样它就不会占用任何字符,并且允许重叠匹配。

(?<=[A-Za-z])(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[0-9]?[A-Z])

用空格替换匹配的边界。

Regex.Replace(yourString, @"(?<=[A-Za-z])(?=[A-Z][a-z])|(?<=[a-z0-9])(?=[0-9]?[A-Z])", " ");

演示

解释:

  • (?<=[A-Za-z])(?=[A-Z][a-z])匹配存在于大写字母或小写字母与紧跟小写字母的大写字母之间的边界。例如考虑这个ABc字符串。这个正则表达式将匹配,边界存在于ABc之间。对于这个aBc示例,这个正则表达式将匹配,边界存在于aBc 之间

  • |逻辑OR运算符。

  • (?<=[a-z0-9])(?=[0-9]?[A-Z])匹配小写字母或数字与后面紧跟大写字母的可选数字之间的边界。例如考虑这个a9A字符串。这个正则表达式将匹配,边界存在于a9A之间,边界也存在于9A之间,因为我们在正向前瞻中给出了[0-9]作为可选。

您只需匹配并加入即可。。

var arr = Regex.Matches(str, @"[A-Z]+(?=[A-Z][a-z]+)|'d|[A-Z][a-z]+").Cast<Match>().Select(m => m.Value).ToArray();
Console.WriteLine(String.Join(" ",arr));

正则表达式一点也不复杂,它只是捕获每个正则表达式并用" " 将它们连接起来

DEMO

像这样的东西应该做

string pattern=@"(?<='d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?='d)|(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])";
Regex.Replace(input,pattern," ");