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

JavaScript regular expression to find pattern in "commented" code

本文关键字:代码 查找 模式 注释 正则表达式 用于 JavaScript      更新时间:2023-09-26

我有存储在字符串中的JavaScript片段。例如,我需要查看字符串,确定它们是否包含特定的代码"special[i].code"。

我只关心特定代码是否没有被注释掉。如果它找到未注释的代码,我需要返回一个 true 值,或者只返回位置。

存储在字符串中的示例代码段。

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的

匹配

注释的困境是你也必须
匹配字符串因为注释部分可以嵌入到字符串中。

鉴于您最终匹配了注释、字符串、非注释
非注释,您希望匹配您的特殊代码

可能是您想单匹配所有内容
的情况直到找到您的特殊代码。然后你会有一个匹配
导致真/假。

你会这么想,并且可以设置一个正则表达式来做到这一点......
但是,如果未找到匹配项,这将导致复杂性问题。

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

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

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

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

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

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

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

以下是一些具有相应匹配项的示例:

正则表达式返回:真(包含未提交的实例)

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


正则表达式返回:真(包含未提交的实例)

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