2012-02-13 23 views
4

我試圖從JavaScript文件中提取代碼註釋塊。我正在製作一個簡單的代碼記錄器。如何使用正則表達式查找多行JavaScript註釋塊?

一個例子是:

/** @Method: setSize 
* @Description: setSize DESCRIPTION 
* @param: setSize PARAMETER 
*/ 

我需要拉出評論設置這樣的,最好到一個數組。

就這一點,我已經得到了,但意識到這可能不是處理新線的標籤,等:

\/\*\*(.*?)\*\/ 

(好吧,這似乎將是簡單的,但我兜兜試圖讓它工作。)

+2

我不知道正則表達式是你在處理多行和解析邏輯取決於它是否是第一個/最後使用這一個最好的工具/中間線... – 2012-02-13 15:09:03

回答

4

根據你想繼續用提取的docblocks做什麼,想到多種方法。如果你只需要沒有進一步引用的docblocks,String.match()就足夠了。否則,你可能需要塊的索引。

正如其他人已經指出的,JavaScript的RegEx機器是一切,但功能強大。如果你習慣了PCRE,這感覺就像用雙手綁在背後一樣工作。 [\s\S](空格字符,非空格字符)相當於dotAll - 也捕獲換行符。

這應該讓你開始:

var string = 'var foo = "bar";' 
    + '\n\n' 
    + '/** @Method: setSize' 
    + '\n * @Description: setSize DESCRIPTION' 
    + '\n * @param: setSize PARAMETER' 
    + '\n */' 
    + '\n' 
    + 'function setSize(setSize) { return true; }' 
    + '\n\n' 
    + '/** @Method: foo' 
    + '\n * @Description: foo DESCRIPTION' 
    + '\n * @param: bar PARAMETER' 
    + '\n */' 
    + '\n' 
    + 'function foo(bar) { return true; }'; 

var docblock = /\/\*{2}([\s\S]+?)\*\//g, 
    trim = function(string){ 
     return string.replace(/^\s+|\s+$/g, ''); 
    }, 
    split = function(string) { 
     return string.split(/[\r\n]\s*\*\s+/); 
    }; 

// extract all doc-blocks 
console.log(string.match(docblock)); 

// extract all doc-blocks with access to character-index 
var match; 
while (match = docblock.exec(string)) { 
    console.log(
     match.index + " characters from the beginning, found: ", 
     trim(match[1]), 
     split(match[1]) 
    ); 
} 
+0

感謝紳士的幫助!真棒。這就是爲什麼我喜歡這個板子。 – 2012-02-13 19:02:11

1

這應該抓住一個評論塊\/\*\*[^/]+\/。我不認爲Regexp是從這些塊生成數組的最佳方式。這正則表達式基本上說:

查找/**(星號和正斜槓與\轉義)

然後找到任何不是/

然後找到一個/

這是原油但一般應該工作。下面是一個活生生的例子http://regexr.com?300c6

+0

找到最後的更好方法是使用非貪婪模式'。*?\ * \ /'。第一部分('。*?')匹配任何內容,但得到匹配的最短模式。然後'\ * \ /'匹配註釋的結尾。 – mcrumley 2012-02-13 15:59:41

+0

@mcrumley雖然你需要啓用dotall標誌,否則'。*?'不匹配返回字符,這是一個小清潔器。我不認爲JavaScript支持dotall標誌。 – MrMisterMan 2012-02-13 16:04:21

+0

@mcrumley這個問題證實了javascript中不支持dotall標誌,但是建議使用'[\ s \ S] *?'的解決方法http://stackoverflow.com/questions/1068280/javascript-regex-multiline-flag -doesnt-work – MrMisterMan 2012-02-13 16:06:05

0

什麼一些神奇:)

comment.replace(/@(\w+)\s*\:\s*(\S+)\s+(\w+)/gim, function (match, tag, name, descr) { 
    console.log(arguments); 
    // Do sth. ... 
}); 

我沒有測試,所以對正則表達式沒有保證,只要你指向一個可能做一些正則表達式,搜索約翰Resig方式8-)

相關問題