使用Node.js区分正则规则与JavaScript文件中的斜杠(除法)

时间:2016-08-09 09:26:42

标签: javascript node.js parsing buffer

我试图通过将它作为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.
    }
}

文件中没有评论,所以我不必担心///**/

我应该如何区分分裂符号和正则表达式?

1 个答案:

答案 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' } ]

如您所见,标记生成器正确地将前两个斜杠标识为正则表达式的一部分,将最后一个斜杠标识为除法运算符。