簡體   English   中英

解析JS代碼以獲取注釋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM