2013-03-11 143 views
4

我有一些詞,如「Light Purple」和「Dark Red」,它們存儲爲「LightPurple」和「DarkRed」。如何檢查單詞「LightPurple」中的大寫字母,並在「Light」和「Purple」之間放置一個空格以形成「Light Purple」單詞。在兩個單詞之間加一個空格

在此先感謝您的幫助

+9

會這樣工作:''LightPurple「.replace(/([a-z])([A-Z])/,'$ 1 $ 2')'? – 2013-03-11 16:05:43

+0

您應該添加此作爲答案@RocketHazmat;) – Simon 2013-03-11 16:10:56

+1

[** This **](https://xkcd.com/208/)剛剛發生。 – andyb 2013-03-11 16:36:25

回答

10

您可以使用正則表達式在大寫字母旁邊有小寫字母的地方添加空格。

事情是這樣的:

"LightPurple".replace(/([a-z])([A-Z])/, '$1 $2') 

UPDATE:如果你有2分以上的話,那麼你就需要使用g標誌,以配合他們。

"LightPurpleCar".replace(/([a-z])([A-Z])/g, '$1 $2') 

更新2:如果試圖分裂的話就像CSVFile,那麼你可能需要使用這個表達式來代替:

"CSVFilesAreCool".replace(/([a-zA-Z])([A-Z])([a-z])/g, '$1 $2$3') 
+0

@Hazmat,仍然這個正則表達式不滿足我的需要,就像這個「CCVCode」不會將字符串拆分爲「CCV代碼」,所以我認爲RE需要更多的調整來解決這個問題。但是,我的自定義Javascript處理這樣的例子。我的答案就在你的下面。 PS:我已經投了你的答案,雖然:) – KMX 2013-03-11 17:13:11

+0

@KMX:是的,正則表達式並不完美,但對於OP的情況,它可能已經足夠好了。 – 2013-03-11 17:26:41

+0

@KMX:我試圖更新它。這看起來會起作用。 :) – 2013-03-11 17:33:13

0

你可以比較每個字符的大寫字母的字符串。

function splitAtUpperCase(input){ 
    var uppers = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    //start at 1 because 0 is always uppercase 
    for (var i=1; i<input.length; i++){ 
     if (uppers.indexOf(input.charAt(i)) != -1){ 
     //the uppercase letter is at i 
     return [input.substring(0,i),input.substring(i,input.length)]; 
     } 
    } 
} 

輸出是一個包含第一個和第二個單詞的數組。

1

好吧,分享我的經驗。我也有一些其他語言的這個工具,它工作得很好。爲了你,我剛剛創建了一個JavaScript版本用一個例子,所以你試試這個:

var camelCase = "LightPurple"; 
var tmp = camelCase[0]; 
for (i = 1; i < camelCase.length; i++) 
{ 
    var hasNextCap = false; 
    var hasPrevCap = false; 

    var charValue = camelCase.charCodeAt(i); 
    if (charValue > 64 && charValue < 91) 
    { 
     if (camelCase.length > i + 1) 
     { 
      var next_charValue = camelCase.charCodeAt(i + 1); 
      if (next_charValue > 64 && next_charValue < 91) 
       hasNextCap = true; 
     } 

     if (i - 1 > -1) 
     { 
      var prev_charValue = camelCase.charCodeAt(i - 1); 
      if (prev_charValue > 64 && prev_charValue < 91) 
       hasPrevCap = true; 
     } 


     if (i < camelCase.length-1 && 
      (!(hasNextCap && hasPrevCap || hasPrevCap) 
      || (hasPrevCap && !hasNextCap))) 
      tmp += " "; 
    } 
    tmp += camelCase[i]; 
} 

這裏是demo

相關問題