JavaScript正则表达式在“注释”代码中查找模式

时间:2016-01-14 18:36:01

标签: javascript regex comments

我有存储在字符串中的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)

我不知道正则表达式足以构建正确的表达式。试图使用编辑器,但因为//和/ *本身就是保留字符,即使我逃避它们,我也无法正确检测它。即使我尝试做// //或//*.

之类的事情

任何帮助都将不胜感激!!

1 个答案:

答案 0 :(得分:0)

你可以使用它。
注意 - 这是JavaScript特有的

匹配评论的困境是你必须匹配字符串 评论部分可以嵌入字符串中。

鉴于您最终匹配的评论,字符串,非评论 非评论,您需要匹配特殊代码

可能是您希望单独匹配所有内容的情况 直到找到您的特殊代码。然后你就会有一场比赛 导致TRUE / FALSE。

你会认为,并且可以设置正则表达式来做到这一点...... 如果找不到匹配项, BUT 会导致复杂性问题。

所以,最终发生的事情是你必须坐在一个循环中,得到所有的 部分直到没有更多的匹配, OR ,它会找到你特殊的代码 寻找,然后你可以选择爆发。
不确定JS,但如果你不能坐在一个循环中,只需一气呵成,就可以找到 然后检查捕获缓冲区3阵列(或者,如果它的一个大的那么,每三个一个 数组)。

在此正则表达式中,特殊代码(如果找到)将始终位于组3中 因此,您只需检查组3是否为NULL,设置标志,然后退出循环。

完成后,根据是否设置标志返回适当的响应。

这是压缩和分隔的/../正则表达式:

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

这是可读格式的 Raw 正则表达式(带注释):

    (                                # (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

相关问题