我正在研究一个问题,我需要确保在我的代码库中调用console.log
时是否存在特定参数。简单地说,主要目标是在不存在的情况下添加该论点。
在我的初始方法中,我将参数列表提取到console.log(...)
,并考虑以某种方式将其放入任何数组中(我不确定如何。我希望使其足够可靠,如关闭括号,逗号可以在字符串内作为函数的参数等)。
复杂的实例将是
console.log("this is a string,another()",'single \'quote\'',param1, param['key'+some_variable]);
所以任何方法或建议都可以帮助我。
答案 0 :(得分:0)
注意:下面的代码和正则表达式模式可用于解析单个console.log
行作为输入。当您需要解析整个代码时,需要检查JavaScript parser in JavaScript。
您可以使用两步法:从一开始就移除console.log(
,使用);
从最后移除replace
,然后使用带有正则表达式的match
提取每个单个参数,可以是双引号或单引号字符串文字,也可以是普通变量,内部没有逗号。
您可以使用
var s = 'console.log(/s[\\\\\\/]/g,a/b,`${`foobar, and more foobar`}`,"this is a string,another()",\'single \\\'quote\\\'\',param1, param[\'key\'+some_variable],`"\\` and more`);';
console.log(s.replace(/^console\.log\(|\);$/g,'').match(/\/(?:\\.|[^\\\/])+\/[gim]*|`\${`[^`\\]*(?:\\.[^\\`]*)*`}`|(?:"[^"\\]*(?:\\.[^\\"]*)*"|'[^'\\]*(?:\\.[^\\']*)*'|`[^`\\]*(?:\\.[^\\`]*)*`|[^,])+/g));
用于解析 console.log()
内的字符串的主模式是
/\/(?:\\.|[^\\\/])+\/[gim]*|`\${`[^`\\]*(?:\\.[^\\`]*)*`}`|(?:"[^"\\]*(?:\\.[^\\"]*)*"|'[^'\\]*(?:\\.[^\\']*)*'|`[^`\\]*(?:\\.[^\\`]*)*`|[^,])+/g
请参阅regex demo。
模式详情:
^console\.log\(
- 字符串开头的console.log(
字符串|
- 或\);$
- );
位于字符串末尾和
\/(?:\\.|[^\\\/])+\/[gim]*
- 尝试匹配正则表达式文字(以/
开头的文字,然后可能有1个或多个非/
或\
+任何字符,并且可以在追踪g
i
,m
或/
组合
`\${`[^`\\]*(?:\\.[^\\`]*)*`}`
- 匹配特定模板字符串语法(?:"[^"\\]*(?:\\.[^\\"]*)*"|'[^'\\]*(?:\\.[^\\']*)*'|[^,'"]+)+
- 1个或多个序列:
"[^"\\]*(?:\\.[^\\"]*)*"
- "
后跟0 {+ 1}}和\
以外的0 +字符,后跟0 {+ 1}} +任何字符的序列但是除了"
和\
以外的0 +字符后面的换行符(双引号文字模式)\
- 或与上述类似的模式,但使用单引号"
- 与上述|'[^'\\]*(?:\\.[^\\']*)*'
- 或|`[^`\\]*(?:\\.[^\\`]*)*`
,|[^,'"]+
,,
以外的1个或多个字符。