c#String - 拆分Pascal案例

时间:2014-10-04 05:21:20

标签: c# regex string

我一直在尝试使用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#代码中实现时,它就失败了。

请帮帮我。感谢。

3 个答案:

答案 0 :(得分:3)

在正则表达式中使用lookarounds,以便它不会消耗任何字符,并且允许重叠匹配。

(?<=[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])", " ");

DEMO

<强>解释

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

  • |逻辑OR运算符。

  • (?<=[a-z0-9])(?=[0-9]?[A-Z])匹配小写字母或数字与可选数字之间存在的边界,紧接着是大写字母。例如。考虑这个a9A字符串。并且此正则表达式将匹配,边界存在于a9A之间,并且边界存在于9A之间,因为我们将[0-9]作为可选积极向前看。

答案 1 :(得分:0)

您可以匹配并加入..

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

答案 2 :(得分:0)

这样的事情应该做

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