2014-10-04 58 views
-1

我一直在試圖讓一個C#正則表達式命令將像C#字符串 - 斯普利特Pascal大小寫

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

我想他加入他們不想分開5. – 2014-10-04 05:30:24

+0

我不完全確定你要求什麼 - 你在http://stackoverflow.com/questi給出了非常詳細的答案ons/26188882/split-pascal-case-in-javascript-certain-case,而不是直接將其轉換爲C#,您可以隨意組合部分,現在尋找某種幫助。我建議你進行直接轉換,並要求「如何合併下面的正則表達式」(如果你自己做不到)。還要考慮保持樣本代碼的質量與該答案中的代碼質量相當 - 沒有評論的正則表達式大多不可讀。 – 2014-10-04 05:44:02

+0

就像刪除對[0-9]的任何引用並將其置於單獨的替換中一樣簡單。查看@AmitJoki regex'([AZ] +(?= $ | [AZ] [az])| [AZ]?[az] + | [0-9] +)' – sln 2014-10-04 05:58:35

回答

1

在您的正則表達式中使用lookaround,以便它不會消耗任何字符,並且允許重疊匹配。

(?<=[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])", " "); 

DEMO

說明:

  • (?<=[A-Za-z])(?=[A-Z][a-z])匹配其間存在一個大寫或小寫的字母和大寫字母將其緊跟一個小寫字母這是邊界。例如。考慮這個ABc字符串。這個正則表達式匹配,邊界存在於ABc之間。對於這個aBc例如,此正則表達式將匹配,上的邊界存在其間aBc

  • |邏輯或操作。

  • (?<=[a-z0-9])(?=[0-9]?[A-Z])匹配這是存在其間的小寫字母或數字和一個可選的數字,其緊接其後加入一個大寫字母的邊界。例如。考慮這個a9A字符串。並且這個正則表達式匹配,邊界存在於a9A之間,並且邊界也存在於9A之間,因爲我們給出了[0-9]作爲正向預測中的可選項。

+0

yep.OP的預期輸出是'EYD Less Than5 Days' – 2014-10-04 05:31:18

+0

thanks updated .. – 2014-10-04 05:42:35

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

的正則表達式是都不復雜,它只是捕捉每一個" "

DEMO

0

像這樣的東西應該做

string [email protected]"(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)|(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])"; 
Regex.Replace(input,pattern," "); 
+0

請考慮將您的答案的質量與JavaScript版本中OP的質量相匹配。沒有評論的正則表達式對於未來的讀者來說基本沒用。 – 2014-10-04 05:46:00