2016-01-30 50 views
2
function hyphenate(str) { 

    var replace = "-"; 
    str = str.toLowerCase().replace(/[\s_\b]/g, replace); 

    console.log(str); 
    return str; 
} 

hyphenate("This Is Hyphenate"); // this-is-hyphenate 
hyphenate("camelCaseString"); // camel-case-string 

我試圖讓我的代碼來產生第二函數調用的結果,但還沒有確定可以做到這一點的模式。任何援助將不勝感激。正則表達式的駱駝字符串分割成單獨的詞

回答

3

注您的[\s_\b]中的\b表示退格字符。不知道你真的需要這個。

我會使用一個有點不同的邏輯:一個字內的每個大寫字母前添加一個連字符,然後替換,把小寫:

var re = /[\s_]+|([a-z0-9])(?=[A-Z])/g; 
 
var str = 'camelCaseString<br/>This  Is Hyphenate<br/>This_Should_Hyphenate'; 
 
var result = str.replace(re, "$1-").toLowerCase(); 
 
document.body.innerHTML += result;

說明:

  • [\s_]+ - 一個或多個空格或下劃線
  • | - 或...
  • ([a-z0-9]) - (第1組),小寫字母或數字(因爲\B不讓我們_匹配後,一個大寫字母,添加A-Z如果你希望每個大寫字母之前添加-
  • (?=[A-Z]) - 一個大寫ASCII字母的測試(因爲它是一個向前看,一個零寬度斷言,所以沒有被使用)。
+0

對不起,我之前的意思是說如何處理像這樣的格式「This_Should_Hyphenate」 – brndng

+0

'_'的問題是它被認爲是一個單詞字符。我加了一個修復程序。 –

+0

非常感謝。您給了我一些很好的線索,以瞭解更多關於正則表達式模式的知識。我非常感謝,因爲我正在努力學習儘可能多的東西。所以,只有當大寫字母跟在後面時,基本上lookahead([a-z0-9])(?= [A-Z])才匹配([a-z0-9])?我希望我正確理解這個邏輯。 「$ 1-」將在比賽結束後放置一個連字符? – brndng

1

lowercasing之前嘗試前瞻:

function hyphenate(str) { 
    return str.split(/[\s_\b]|(?=[A-Z])/).join('-').toLowerCase(); 
} 
+0

這是一個非常優雅的答案,我需要對lookaheads進行一些研究。 – brndng

1

您可以使用捕捉組來獲得小寫其次是大寫字母,然後轉換整個字符串轉換爲小寫:

str.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();