我有这段用正则表达式来拆分CamelCase的代码:
Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled).Trim();
然而,它不能正确地分割这个: ShowXYZColours
它会生成Show XYZColours
而不是 Show XYZ Colours
我该如何获得所需的结果?
我有这段用正则表达式来拆分CamelCase的代码:
Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled).Trim();
然而,它不能正确地分割这个: ShowXYZColours
它会生成Show XYZColours
而不是 Show XYZ Colours
我该如何获得所需的结果?
具备 Unicode 支持的
(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})
分解:
(?= # 向前查找:一个位置后面紧跟着... \p{Lu}\p{Ll} # 一个大写字母和一个小写字母 ) # | # 或者 (?<= # 向后查找:一个位置前面紧贴着... \p{Ll} # 一个大写字母 ) # (?= # 向前查找:一个位置后面紧跟着... \p{Lu} # 一个小写字母 ) #
在正则表达式的分割函数中使用。
编辑:当然,如果需要或者您的正则表达式引擎不支持Unicode类别,您可以将\p{Lu}
替换为[A-Z]
并将\p{Ll}
替换为[a-z]
。
您可以使用类似这样的内容:
(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])
代码:
string strRegex = @"(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"ShowXYZColours";
string strReplace = @" $1$2";
return myRegex.Replace(strTargetString, strReplace);
输出:
Show XYZ Colours
Regex.Split("ShowXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")
{string[4]}
[0]: ""
[1]: "Show"
[2]: "XYZ"
[3]: "Colors"
但它适用于camelCase(而不是PascalCase):
Regex.Split("showXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")
{string[3]}
[0]: "show"
[1]: "XYZ"
[2]: "Colors"
你可以尝试这个:
Regex.Replace(input, "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
示例:
Regex.Replace("TheCapitalOfTheUAEIsAbuDhabi", "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
输出:阿联酋的首都是阿布扎比