我试图通过将它作为Node.js中的缓冲区读取并逐个遍历字符来尝试将JavaScript中的正则表达式(/ / regex here /)与除法(/)区分开来。原因
const fs = require('fs');
const buf = fs.readFileSync('sample.js');
const slash = '/'.codePointAt(0);
const backSlash = '\\'.codePointAt(0);
let escaped = false;
for(let key of buf.keys()) {
if(buf[key] === slash && !escaped) {
// How do I distinguish this slash? Is it a regex or is it a division sign?
}
if(escaped) {
escaped = false;
} else if(buf[key] === backSlash) {
escaped = true; // set escaped to true to ignore the next character.
}
}
文件中没有评论,所以我不必担心//
,/*
或*/
我应该如何区分分裂符号和正则表达式?
答案 0 :(得分:0)
使用Esprima的标记程序功能:
var esprima = require('esprima');
var tokens = esprima.tokenize('var regex = /foo/bar; var math = 1 / 2');
console.log(tokens);
您将获得以下输出:
[ { type: 'Keyword', value: 'var' },
{ type: 'Identifier', value: 'regex' },
{ type: 'Punctuator', value: '=' },
{ type: 'RegularExpression',
value: '/foo/bar',
regex: { pattern: 'foo', flags: 'bar' } },
{ type: 'Punctuator', value: ';' },
{ type: 'Keyword', value: 'var' },
{ type: 'Identifier', value: 'math' },
{ type: 'Punctuator', value: '=' },
{ type: 'Numeric', value: '1' },
{ type: 'Punctuator', value: '/' },
{ type: 'Numeric', value: '2' } ]
如您所见,标记生成器正确地将前两个斜杠标识为正则表达式的一部分,将最后一个斜杠标识为除法运算符。