2016-03-12 58 views
-1

我正在研究LESS中的問題,其中我必須將LESS文件中存在的類分開。JavaScript的正則表達式來打破LESS中的類/ ID

例如,我有一個類,如:

mango{ 
    color:@color; 
    li{ 
    color:red; 
    } 
} 

#big-circle{ 
    color:green; 
    li{ 
    color:@color; 
    } 
    a{ 
    color:red; 
    } 
    #majlis{ 
    background:blue; 
    } 
} 

我已經第一次使用正則表達式如下分裂文件成子芒果#大圈。所以我使用了以下正則表達式:/[\}]*[\}]/gm。但是,雖然它適用於第一種情況,但它在第二種情況下失敗。

任何人都可以建議我如何可能修改我的正則表達式?或者我應該看看一些不同的方法?

上述代碼的輸出(如在類的名稱):

#big-circle 
a 
#majlis 
mango 

雖然我需要將其打入big-circle和僅mango

+1

既然有芒果之間'沒有技術上的差異{'和'一個{' - 無論是字母加一個大括號 - 你需要的HTML元素'的列表(| abbr | b | ...)',這樣你就可以將它們從匹配中排除。另外,'#big-circle'是一個ID,而不是一個類。 – Tomalak

+0

@Tomalak,一個簡單的元素列表將沒有多大用處。 LESS層次結構可能很複雜:一個類可能有另一個類,或者一個ID或一個標籤。此外,芒果甚至不是HTML元素,但是LESS編譯器將它視爲一個。 – AbbaShareen

+0

請勿用正則表達式解析LESS或任何其他語言。你永遠不會做對。 Regexp沒有理論分析能力來解析LESS複雜性的語言。你爲什麼要這樣做? –

回答

0

您可以使用/(\{[^\{\}]*\})/gm去除大括號內的所有內容。通過在過濾輸出上遞歸執行這個正則表達式,您可以提取頂級選擇器。

function extractTopLevelClasses (string) { 
 
    var re = new RegExp(/(\{[^\{\}]*\})/gm); 
 
    var recursiveStrip = function (string) { 
 
     var result = string.replace(re, ' '); 
 
     if (result.indexOf('{') !== -1) { 
 
      result = recursiveStrip(result); 
 
     } 
 

 
     return result; 
 
    }; 
 

 
    var strippedString = recursiveStrip(string); 
 
    var topLevelClasses = strippedString.trim().replace(' ',', '); 
 

 
    return topLevelClasses; 
 
} 
 

 

 
var less = document.getElementById('less-content').innerHTML; 
 
document.getElementById('container').innerHTML = extractTopLevelClasses(less);
<pre id="less-content"> 
 
mango{ 
 
    color:@color; 
 
    li{ 
 
    color:red; 
 
    } 
 
} 
 

 
#big-circle{ 
 
    color:green; 
 
    li{ 
 
    color:@color; 
 
    } 
 
    a{ 
 
    color:red; 
 
    } 
 
    #majlis{ 
 
    background:blue; 
 
    } 
 
} 
 
</pre> 
 
<div id="container"></div>

+0

謝謝。我想知道是否有任何方法可以使用正則表達式提取類定義。例如,獲得大圓圈顏色:綠色; li顏色:@color; } a { color:red; } #majlis { background:blue; } }' 對應這些類的信息呢? – AbbaShareen