регулярное выражение для получения всех JavaScript имен переменных и значений из строки - PullRequest
0 голосов
/ 08 апреля 2020

скажем, у меня есть следующая строка:

let code = `
      var x = 4;
      var y=9,
          w=8
      var z=8080
      other()
      x=12

`

Как мне написать регулярное выражение, которое получает все объявления переменных? В этом случае я хочу вернуть все операторы, а не выражения, поэтому исключите части other() и x=12. Пока у меня есть

let results = `
      var x = 4;
      var y=9,
          w=8
      var z=8080
      other()
      x=12
      
    `.match(/(var)(.*?)(;|,|\n)/g);
    
console.log(results);

Но я не мог понять, как включить также часть w = 8, поскольку это также оператор объявления, исключая выражения. Я попытался .match(/(var|\n)(.*?)(;|,|\n)/g), но это также возвращает х = 12, что я не хочу. Мне также нужно возвращать все блоки операторов, даже если перед ним стоит запятая (либо в предыдущей строке, либо в предыдущем символе, все, что обычно допускает объявление переменной).

Любая идея, как это сделать с помощью регулярных выражений?

РЕДАКТИРОВАТЬ:

с помощью uglify js Я могу сделать следующее (что я и хочу получить в результате):

let strin = `
      var x = 4;
      var y=9,
          w=8,
          kk = {
              ok:1234
          },
		  p,
		  a = undefined
      var z=8080
      other()
      x=12
     
    `
let results = UglifyJS.parse(strin).body.filter(x=>x.__proto__.TYPE == "Var")
.map(x=>
     x.definitions.map(y=>({
        name:y.name.name,
        value:y.value ? findInPos(y.value.start, y.value.end,strin) : undefined
     })),
    
).flat()
function findInPos(start, end,str) {
    return str.substring(
        start.pos,
        end.endpos
    );
}
<script type="text/javascript" src="https://yaakovyitzchak.github.io/coby/uglify.js">
</script>

Но кажется немного излишним просто извлечь значение string каждой переменной? (Мне не нужно оценивать его, просто получите строковое значение, например, так)

1 Ответ

2 голосов
/ 10 апреля 2020

Эту задачу можно легко решить с помощью API-интерфейса компилятора TypeScript, поскольку он может анализировать не только код TypeScript, но и код JavaScript. Поскольку TypeScript компилируется в JavaScript - не должно быть проблем с интеграцией следующего фрагмента TS в проект JS.

См. demo

import ts from "typescript";

const code = `
    var x = 4;
    var y=9,
        w=8
    var z=8080
    other()
    x=12
`;

const sf = ts.createSourceFile(
    "test.js",
    code,
    ts.ScriptTarget.ES2017,
    true,
    ts.ScriptKind.JS,
);

sf.forEachChild((n) => {
    if (ts.isVariableStatement(n)) {
        n.declarationList.declarations.forEach((decl) => {
            const name = decl.name.getText();
            const value = decl.initializer?.getText();
            console.log(`${name} = ${value}`);
        });
    }
});

. Приведенный выше код выводит на консоль следующий вывод:

x = 4
y = 9
w = 8
z = 8080
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...