使用正则表达式拆分驼峰命名法

11

我有这段用正则表达式来拆分CamelCase的代码:

Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled).Trim();

然而,它不能正确地分割这个: ShowXYZColours

它会生成Show XYZColours 而不是 Show XYZ Colours

我该如何获得所需的结果?

4个回答

18

具备 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]


12

.NET演示

您可以使用类似这样的内容:

(?<=[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

演示和说明


这意味着在“Colours”中失去了“Co”。 - Sean
谢谢你提醒我 :) ,我已经更新了我的答案。 - Sujith PS

3
使用Tomalak的正则表达式与.NET System.Text.RegularExpressions一起使用会在结果数组的位置0创建一个空条目:
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"

1
你可以尝试这个:

你可以尝试这个:

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();

输出:

输出:阿联酋的首都是阿布扎比


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接