在JavaScript中查找文本字符串
我有一个大的有效JavaScript文件(utf-8),需要从中自动提取所有文本字符串 为简单起见,文件中不包含任何注释块,只包含有效的ES6JavaScript代码 一旦我发现出现了在JavaScript中查找文本字符串,javascript,regex,node.js,Javascript,Regex,Node.js,我有一个大的有效JavaScript文件(utf-8),需要从中自动提取所有文本字符串 为简单起见,文件中不包含任何注释块,只包含有效的ES6JavaScript代码 一旦我发现出现了,,,,,,,,,,,,,,等等,我应该扫描文本块的末尾,这是我被卡住的地方 是否有已知和/或可重用的算法用于检测有效ES6 JavaScript文本块的结尾 UPDATE-1:我的JavaScript文件不仅很大,我还必须将其作为流进行分块处理,因此Regex绝对不可用。我不想让我的问题复杂化,提到代码的联合块,
,,,,,,,,,,,,,,等等,我应该扫描文本块的末尾,这是我被卡住的地方
是否有已知和/或可重用的算法用于检测有效ES6 JavaScript文本块的结尾
UPDATE-1:我的JavaScript文件不仅很大,我还必须将其作为流进行分块处理,因此Regex绝对不可用。我不想让我的问题复杂化,提到代码的联合块,我会自己弄清楚,如果我有一个算法可以处理内存中的一段代码
UPDATE-2:多亏了这里给出的许多建议,我一开始就成功了,但后来又因为正则表达式而陷入困境
破坏迄今为止建议的任何文本检测技术的正则表达式示例:
/'/
/"/
/\`/
仔细研究了这个问题之后,通过阅读以下内容:,我担心在JavaScript中检测正则表达式是一个全新的游戏,值得一个单独的问题,否则它会变得太复杂。但如果有人能为我指出这个问题的正确方向,我会非常感激
更新-3:经过大量研究,我遗憾地发现,我无法想出一种适用于我的情况的算法,因为正则表达式的存在使任务比最初想象的要复杂得多。根据以下内容:,确定JavaScript中正则表达式的开始和结束是最复杂和复杂的任务之一。如果没有它,我们就无法确定符号,“,”和`何时打开文本块,或者它们是否在正则表达式中。如果您只需要一个近似的答案,或者如果您希望得到与源代码中显示的字符串文字完全相同的字符串文字,那么正则表达式就可以完成这项工作
给定字符串literal“\n”
,您希望单个字符串包含换行符还是两个字符反斜杠和n
- 在前一种情况下,您需要像JavaScript解释器一样解释转义序列。您需要的是JavaScript的lexer,许多人已经编写了这段代码
- 在后一种情况下,正则表达式必须识别转义序列,如
\x40
和\u2026
,因此即使在这种情况下,您也应该从现有的JavaScript lexer复制代码
请参阅函数标记化尝试下面的代码:
txt = "var z,b \n;z=10;\n b='321`1123`321321';\n c='321`321`312`3123`';"
function fetchStrings(txt, breaker){
var result = [];
for (var i=0; i < txt.length; i++){
// Define possible string starts characters
if ((txt[i] == "'")||(txt[i] == "`")){
// Get our text string;
textString = txt.slice(i+1, i + 1 + txt.slice(i+1).indexOf(txt[i]));
result.push(textString)
// Jump to end of fetched string;
i = i + textString.length + 1;
}
}
return result;
};
console.log(fetchStrings(txt));
txt=“var z,b\n;z=10\n b='321`1123`321'\n c='321`321`312`3123`';"
函数fetchStrings(txt,breaker){
var结果=[];
对于(变量i=0;i
我可以让你自己测试一下吗?我相信,经过几次调整后,你应该能够将此解决方案用于块(例如,将每个新块的I重置为0可能是一个很好的起点)。我可以继续解决你的问题,不过我希望你告诉我我是否朝着正确的方向前进:-)
此代码使用递归性跟踪当前状态(代码、字符串、注释或正则表达式)。我不熟悉处理大文件,因此我担心这可能会导致堆栈溢出。作为一种解决方法,您可以将状态保存在全局变量中,并以迭代方式执行所有这些操作
var strings=[];
代码(document.getElementsByTagName('script')[0].textContent,0);
document.write(“”+JSON.stringify(strings,0,2)+“”);
功能代码(文本,i){
如果(i
var s=“”;
var r=/‘allo’/;
//“单行注释”
var f=function(){return''a str'ing`';};
/**“多线”
`评论`**/
变量o={“prop”:“va\“'lue”};
var l='1\
a\
多重\
线\
字符串';
解析JavaScrip的唯一方法
`foo${"bar"+`baz`}`