[英]Parse JS code for comments
我有一個小的NodeJS程序,可用來從指向它的文件中提取代碼注釋。 它通常可以工作,但是我在處理某些問題時會誤將某些JS字符串(全局模式)解釋為代碼注釋。
我正在使用正則表達式[^:](\\/\\/.+)|(\\/\\*[\\W\\w\\n\\r]+?\\*\\/)
來解析以下測試文件:
function DoStuff() {
/* This contains the value of foo.
Foo is used to display "foo"
via http://stackoverflow.com
*/
this.foo = "http://google.com";
this.protocolAgnosticUrl = "//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/core.js";
//Show a message about foo
alert(this.foo);
/// This is a triple-slash comment!
const globPatterns = [
'path/to/**/*.tests.js',
'!my-file.js',
"!**/folder/*",
'another/path/**/*.tests.js'
];
}
這是一個實時演示,可幫助可視化正則表達式正確捕獲的內容和內容: https : //regex101.com/r/EwYpQl/1
我只需要在此處找到實際的代碼注釋,而不是有時可能出現在字符串中的類似注釋的語法。
我必須同意這樣的意見:在大多數情況下,即使RegExp
可以針對特定且定義明確的用例進行工作,也最好使用解析器。
問題不在於您甚至不能認為它可能不適合那個非常特殊的用例,甚至可能有很多您並不真正在乎或不需要的邊緣情況,但這可能會破壞該解決方案。 實際的問題是,如果您開始圍繞次優解決方案進行構建,並且您的需求隨時間推移而變化,那么您將開始對出現的問題進行修補。 總有一天,您可能會發現自己擁有一個龐大的代碼庫,里面充滿了無法再擴展的補丁程序,唯一的解決方案可能是從頭開始。
無論如何,我們中的一些人已經警告過您,並且仍然很有可能您的用例是如此簡單,並且將來不會更改。 我仍然會考慮在某個時候從RegExp
遷移到解析器,但是也許您可以同時使用它:
(^ +\/\/(.*))|(["'`]+.*["'`]+.*\/\/(.*))|(["'`]+.*["'`]+.*\/\*([\W\w\n\r]+?)\*\/)|(^ +\/\*([\W\w\n\r]+?)\*\/)
為了以防萬一,我添加了其他一些情況,例如在一些有效代碼之后直接出現的注釋:
編輯以證明第一點以及評論中所說的內容:
我剛剛用以前的RegExp
來回答了這個問題,它只是解決了您在問題中指出的問題(您的RegExp
誤解了包含glob模式的字符串作為代碼注釋)。
因此,我修復了該問題,甚至使它能夠匹配與有效(非注釋)語句在同一行中開頭的注釋。 發布后不久,我注意到最后一個功能僅在該語句包含字符串的情況下才起作用。
這是更新的版本,但是請記住,這正是我們警告您的...:
(^[^"'`\n]+\/\/(.*))|(["'`]+.*["'`]+.*\/\/(.*))|(["'`]+.*["'`]+.*\/\*([\W\w\n\r]+?)\*\/)|(^[^"'`\n]+\/\*([\W\w\n\r]+?)\*\/)
它是如何工作的?
有4個主要組組成整個RegExp
,前兩個用於單行注釋,后兩個用於多行注釋:
(^[^"'`\\n]+//(.*))
(["' ]+.*["'
]+. //(. ))
(["' ]+.*["'
]+.*/*([\\W\\w\\n\\r]+?)*/)
(^[^"'`\\n]+/*([\\W\\w\\n\\r]+?)*/)
您將看到一些重復的模式:
^[^"'`\\n]+
:從行的開頭開始,匹配不包含任何引號或換行符的任何內容。
`
用於ES2015 模板文字 。
換行符也被排除在外,以防止匹配空行。
請注意, +
將阻止匹配的注釋,這些注釋未用至少一個空格填充。 您可以嘗試用*
替換它,但是它將再次匹配包含glob模式的字符串。
["'
:這匹配引號之間的所有內容,包括看起來像注釋但是字符串一部分的任何內容。 無論您匹配什么,它將在該字符串之外,因此使用另一個組可以匹配注釋。 ]+.*["'
]+.*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.