我一直在尝试使用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#代码中实现时,它就失败了。
请帮帮我。感谢。
答案 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])", " ");
<强>解释强>
(?<=[A-Za-z])(?=[A-Z][a-z])
匹配大写字母和大写字母之间存在的边界,紧接着是小写字母。例如。考虑这个ABc
字符串。这个正则表达式匹配,边界存在于A
和Bc
之间。对于此aBc
示例,此正则表达式将匹配,边界存在于a
和Bc
之间
|
逻辑OR运算符。
(?<=[a-z0-9])(?=[0-9]?[A-Z])
匹配小写字母或数字与可选数字之间存在的边界,紧接着是大写字母。例如。考虑这个a9A
字符串。并且此正则表达式将匹配,边界存在于a
和9A
之间,并且边界存在于9
和A
之间,因为我们将[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));
正则表达式根本不复杂,只是捕获每个正则表达式并使用" "
答案 2 :(得分:0)
这样的事情应该做
string pattern=@"(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)|(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])";
Regex.Replace(input,pattern," ");