没有时间将其转换为 JS。这是 Perl 示例中的正则表达式,但该正则表达式可以与 JS 一起使用。
C 注释,双/单字符串引号 - 取自 Jeffrey Friedl 的“strip C comments”,后来由 Fred Curtis 修改,适用于包括 C++ 注释和目标分号(由我)。
捕获组 1(可选),包括分号之前的所有内容,组 2 是分号(但可以是任何内容)。
修饰符是 //xsg。
下面的正则表达式用于替换运算符 s/pattern/replace/xsg (即:替换为 $1[$2] )。
我认为你的帖子只是想知道这是否可以做到。如果您真的需要,我可以包含一个带注释的正则表达式。
$str = <<EOS;
testfunc();
testfunc2("test;test");
testfunc3("test';test");
testfunc4('test";test');
//testfunc5();
/* testfunc6(); */
/*
testfunc7();
*/
/*
//testfunc8();
*/
testfunc9("test\"test");
EOS
$str =~ s{
((?:(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|//(?:[^\\]|\\\n?)*?\n)|(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|.[^/"'\\;]*))*?)(;)
}
{$1\[$2\]}xsg;
print $str;
输出
testfunc()[;]
testfunc2("test;test")[;]
testfunc3("test';test")[;]
testfunc4('test";test')[;]
//testfunc5();
/* testfunc6(); */
/*
testfunc7();
*/
/*
//testfunc8();
*/
testfunc9("test"test")[;]
用评论扩展
( ## Optional non-greedy, Capture group 1
(?:
## Comments
(?:
/\* ## Start of /* ... */ comment
[^*]*\*+ ## Non-* followed by 1-or-more *'s
(?:
[^/*][^*]*\*+
)* ## 0-or-more things which don't start with /
## but do end with '*'
/ ## End of /* ... */ comment
|
// ## Start of // ... comment
(?:
[^\\] ## Any Non-Continuation character ^\
| ## OR
\\\n? ## Any Continuation character followed by 0-1 newline \n
)*? ## To be done 0-many times, stopping at the first end of comment
\n ## End of // comment
)
| ## OR, various things which aren't comments, group 2:
(?:
" (?: \\. | [^"\\] )* " ## Double quoted text
|
' (?: \\. | [^'\\] )* ' ## Single quoted text
|
. ## Any other char
[^/"'\\;]* ## Chars which doesn't start a comment, string, escape
) ## or continuation (escape + newline) AND are NOT semi-colon ;
)*?
)
## Capture grou 2, the semi-colon
(;)