簡體   English   中英

JavaScript正則表達式可在“注釋”代碼中查找模式

[英]JavaScript regular expression to find pattern in “commented” code

我有存儲在字符串中的JavaScript代碼段。 我需要查看字符串,確定它們是否包含特定的代碼“ special [i] .code”。

我只在乎是否未注釋掉特定代碼。 如果找到未注釋的代碼,則需要返回一個真值或僅返回位置。

存儲在字符串中的示例片段。

function someFunction() {
    special[i].code
}
RegEx returns: True (Contains uncommitted occurrence)

function someFunction() {
    // special[i].code
}
RegEx returns: False (Occurrence commented out)

function someFunction() {
    /* 
    special[i].code
    morecode();
    */
}
RegEx returns: False (Occurrence commented out)

function someFunction() {
    /* special[i].code */
    special[i].code
}
RegEx returns: True (Contains uncommitted occurrence)

我對正則表達式的了解不足以構建合適的表達式。 嘗試使用編輯器,但是由於//和/ *本身是保留字符,即使我轉義了它們,也無法正確檢測到。 即使當我嘗試執行///或// *之類的操作時。

任何幫助,將不勝感激!!

您可以使用它。
注意-這是特定於JavaScript的

帶有匹配注釋的困境是您還必須匹配字符串
因為注釋部分可以嵌入字符串中。

鑒於您最終匹配了注釋,字符串,非注釋以及
非注釋,則需要匹配特殊代碼

您可能想單獨匹配所有內容
直到找到您的特殊代碼 那你將有一場比賽
得出TRUE / FALSE。

您可能會認為,可以設置一個正則表達式來做到這一點...
但是,如果找不到匹配項,這將導致復雜性問題。

因此,最終發生的事情是,您必須坐在一個循環中,將所有
直到沒有更多匹配項為止, 或者找到所需的特殊代碼
尋找,然后您可以選擇在哪里突破。
不確定JS,但是如果您不能循環使用,只需一次性找到所有內容,
然后檢查捕獲緩沖區3數組(如果每1個大,則檢查第三個數組)
數組)。

在此正則表達式中,特殊代碼(如果找到)將始終位於組3中。
因此,您只需要檢查組3是否不為NULL,設置一個標志,然后退出循環即可。

完成后,根據是否設置了標志返回適當的響應。

這是壓縮和定界的/../正則表達式:

/(\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/|\/\/[^\n]*(?:\n|$))|("[^"\\]*(?:\\[\S\s][^"\\]*)*"|'[^'\\]*(?:\\[\S\s][^'\\]*)*'|(?!special\[i\]\.code)[\S\s](?:(?!special\[i\]\.code)[^\/"'])*)|(special\[i\]\.code)/  

這是可讀格式的Raw regex(帶有注釋):

    (                                # (1 start), Comments 
         /\*                              # Start /* .. */ comment
         [^*]* \*+
         (?: [^/*] [^*]* \*+ )*
         /                                # End /* .. */ comment
      |  
         //  [^\n]*                       # Start // comment
         (?: \n | $ )                     # End // comment
    )                                # (1 end)
 |                                 # OR,
    (                                # (2 start), Non - comments 
         "
         [^"\\]*                          # Double quoted text
         (?: \\ [\S\s] [^"\\]* )*
         "
      |  
         '
         [^'\\]*                          # Single quoted text
         (?: \\ [\S\s] [^'\\]* )*
         ' 
      |  
         (?! special\[i\]\.code )         # This is to blow by any non-comment '/' char or any unbalanced quotes (technically a code error)
         [\S\s]                        
                                          # Any other char, but not these special tokens.
                                          # Chars which doesn't start a comment or string
         (?:                              # But not special tokens
              (?! special\[i\]\.code )
              [^/"'] 
         )*
    )                                # (2 end)
 |                                 # OR,
    (                                # (3 start), Special Tokens
         special\[i\]\.code                    
    )                                # (3 end)

以下是一些具有相應匹配項的示例:

RegEx返回:True(包含未提交的事件)

function someFunction() {
    special[i].code
}

 **  Grp 0 -  ( pos 0 , len 31 ) 
function someFunction() {

 **  Grp 1 -  NULL 
 **  Grp 2 -  ( pos 0 , len 31 ) 
function someFunction() {

 **  Grp 3 -  NULL 

-------------------

 **  Grp 0 -  ( pos 31 , len 15 ) 
special[i].code  
 **  Grp 1 -  NULL 
 **  Grp 2 -  NULL 
 **  Grp 3 -  ( pos 31 , len 15 ) 
special[i].code  

可以在這里中斷,因為組3不為NULL


RegEx返回:True(包含未提交的事件)

function someFunction() {
    /* special[i].code */
    special[i].code
}

 **  Grp 0 -  ( pos 0 , len 31 ) 
function someFunction() {

 **  Grp 1 -  NULL 
 **  Grp 2 -  ( pos 0 , len 31 ) 
function someFunction() {

 **  Grp 3 -  NULL 

-------------------

 **  Grp 0 -  ( pos 31 , len 21 ) 
/* special[i].code */  
 **  Grp 1 -  ( pos 31 , len 21 ) 
/* special[i].code */  
 **  Grp 2 -  NULL 
 **  Grp 3 -  NULL 

-------------------

 **  Grp 0 -  ( pos 52 , len 6 ) 


 **  Grp 1 -  NULL 
 **  Grp 2 -  ( pos 52 , len 6 ) 


 **  Grp 3 -  NULL 

-------------------

 **  Grp 0 -  ( pos 58 , len 15 ) 
special[i].code  
 **  Grp 1 -  NULL 
 **  Grp 2 -  NULL 
 **  Grp 3 -  ( pos 58 , len 15 ) 
special[i].code  

可以在這里中斷,因為組3不為NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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