从JavaScript文件中提取变量声明

时间:2018-03-13 09:09:54

标签: javascript regex string regex-lookarounds

我正在尝试创建一个变量名称交换器。简单地迭代JavaScript文件中的行,并使用我可以提供的字典中的随机名称交换每个变量名称。

到目前为止,我可以做到这一点,但我无法针对变量关键字优化搜索正则表达式。

我首先定义我正在寻找的关键字:

const VARIABLE_KEYWORDS = ["var", "let", "const"];

然后我迭代输入文件中的每一行并提取变量名并将它们存储在一个数组中。一旦我存储了所有变量名称,我就将它们设为唯一,然后用随机单词在原始文件中替换它们。

这是我的extractVariables(line)逻辑,其中变量行是一个字符串:

function extractVariables(line) {
  let lineCnt = 1;
  let found_vars = [];

  // if the line is not empty, parse it
  if (line.trim().length !== 0) {    
    // find a variable keyword
    for (let key of VARIABLE_KEYWORDS) {
      // regex to match the variable keyword and its not inside a string definition \"|\' , and is not used as a property name |\.
      var re = new RegExp("(?<!\"|\')\\b" + key + "\\b(?!\"|\')", "g");

      // while there are variables declared in the line, add them to the variables array
      while ((match = re.exec(line)) != null) {

        const indexOfKeyword = match.index + key.length;

        // get the name after and store it in an array
        if (indexOfKeyword > 0) { 
          let found_var = line.substr(indexOfKeyword).trim().split(' ').shift();
          // if a keyword is found, but no variable defined afterwards do not break everything
          if(found_var.length !== 0){
            found_vars.push(found_var);    
          }
        }
      }
    }
  }

  return found_vars;
}

我的正则表达式缺少一些修复。

new RegExp("(?<!\"|\')\\b" + key + "\\b(?!\"|\')", "g");
  1. 不支持lookbehind。
  2. 仍然可以找到像“foo var let me be”这样的字符串中的关键字,如果它们是“或”旁边唯一的单词,我只会修复它。
  3. 范围{}被忽略
  4. 有人可以帮帮我吗?

0 个答案:

没有答案