2014-01-24 17 views
10

Ich habe diesen Code Camelcase durch regulären Ausdruck zu spalten:Splitting Camelcase mit regex

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

Es ist jedoch nicht das richtig ist gespalten: ShowXYZColours

Es produziert Show XYZColours statt Show XYZ Colours

Wie bekomme ich das gewünschte Ergebnis?

Antwort

14

Unicode-aware

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

Aufteilung:

 
(?=    # 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 
)     # 

Verwendung mit Ihrem regex Split-Funktion.


EDIT: Natürlich kann man \p{Lu} mit [A-Z] und \p{Ll} mit [a-z] ersetzen kann, wenn das ist, was Sie brauchen oder Ihre Regex-Engine nicht versteht Unicode Kategorien.

6

.NET DEMO

können Sie so etwas wie folgt verwenden:

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

Das ist der Verlust der "Co" in "Farben" – Sean

+0

Vielen Dank für die Erinnerung an mich :), aktualisierte ich meine Antwort. –

1

Tomalak regex mit .NET System.Text.RegularExpressions Verwendung schafft einen leeren Eintrag in der Position 0 des resultierenden Arrays:

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

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

es aber für Camelcase arbeitet (im Gegensatz zu Pascalgegen):

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

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