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