我有存储在字符串中的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)
我不知道正则表达式足以构建正确的表达式。试图使用编辑器,但因为//和/ *本身就是保留字符,即使我逃避它们,我也无法正确检测它。即使我尝试做// //或//*.
之类的事情任何帮助都将不胜感激!!
答案 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