2014-01-24 96 views
10

我有此代码由正则表达式来分割驼峰:与正则表达式分裂驼峰

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

但是,它不能正确地拆分此:ShowXYZColours

它产生Show XYZColours代替Show XYZ Colours

我如何获得理想的结果?

回答

14

支持Unicode的

(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu}) 

击穿:

 
(?=    # look-ahead: a position followed by... 
    \p{Lu}\p{Ll} # an uppercase and a lowercase 
)     # 
|     # or 
(?<=    # look-behind: a position after... 
    \p{Ll}   # an uppercase 
)     # 
(?=    # look-ahead: a position followed by... 
    \p{Lu}   # a lowercase 
)     # 

使用与您正则表达式分割功能。


编辑:当然,你可以用[a-z][A-Z]\p{Ll}更换\p{Lu}如果这是你需要的,或者您正则表达式引擎不理解Unicode的类别。使用托默勒格与.NET System.Text.RegularExpressions正则表达式

6

.NET DEMO

您可以使用这样的事情:

(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z]) 

CODE:

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

OUTPUT:

Show XYZ Colours 

Demo and Explanation

+0

这就是失去“颜色” – Sean

+0

“合作”谢谢你提醒我:),我更新了我的答案。 –

1

创建在所得阵列的0位置的空条目:

Regex.Split("ShowXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})") 

{string[4]} 
    [0]: "" 
    [1]: "Show" 
    [2]: "XYZ" 
    [3]: "Colors" 

它为驼峰虽然(相对于PascalCase):

Regex.Split("showXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})") 

{string[3]} 
    [0]: "show" 
    [1]: "XYZ" 
    [2]: "Colors"