【问题标题】:Find and replace all javascript variables in a text file查找并替换文本文件中的所有 javascript 变量
【发布时间】:2020-10-02 17:22:28
【问题描述】:

我有一个这样的文本文件:

// start file

var nameVar1 = '';
// var nameVar1 = '';

var otherVar1= "test1";

var nameVar2 ="test2",
    otherVar2 =  'test3';
    
var nameVar3    =    true;

var     otherVar3 = false   ;

var objName = {
    test: 'test'
};

var expression = nameVar1 + nameVar2;

// comment

for(var test in templateConfig) {
  if( templateConfig ){ defaultLang = langParam; }
}

// end file

我正在尝试查找所有具有字段的变量并将它们替换为插值并获取以下示例:

// start file

{{nameVar1}}
// var nameVar1 = '';

{{otherVar1}}

{{nameVar2}}
{{otherVar2}}
    
{{nameVar3}}

{{otherVar3}}

{{objName}}

var expression = nameVar1 + nameVar2;

// comment

for(var test in templateConfig) {
  if( templateConfig ){ defaultLang = langParam; }
}

// end file

我得到了一个正则表达式,但它不能很好地工作,因为它还在循环或表达式中找到变量

const regex = /(?<!\/\/\s*?)(?:var|let|const)(?:\s+)(.*?)(?:\s+)?=\s?(?:.*?);/gms;
const subst = `{{$1}}`;
const result = str.replace(regex, subst);

https://regex101.com/r/RVhsBl/2

【问题讨论】:

  • 您为什么要这样做?在编程代码上使用正则表达式?您应该至少使用解析器。并替换文件中的文本?我怀疑你有an XY problem
  • 模板化 javascript 似乎是一个必然有大量错误的想法。
  • @Taplar 曾使用过模板化代码文件(但不是 JS),我可以说它非常笨拙,可能会给您带来全新的问题,因为你生成的所有代码都会做同样的事情,所以像向模板类添加属性这样的事情会将其添加到所有其他生成的代码中,无论你是否愿意。
  • 没有编程知识的普通人可以使用的各种配置文件,html和javascript混合内容的文件。这个想法是制作一个可以独立于代码编辑字段的编辑器......
  • 听起来您只需要允许人们编辑配置,然后您需要让 您的代码 使用该配置进行操作。不生成代码基于配置。

标签: javascript regex typescript variables text


【解决方案1】:

首先,您必须在此处分解 var 逗号分隔声明:

// find
// var x = [{whatever: true}, true, false], y = 'something', z = {x: {john: true}, y: true}

// replace this with
// var x = [{whatever: true}, true, false];
// var y = 'something';
// var z = {x: {john: true}, y: true}

然后你可以使用这种方法: 您可以像这样在 var 和分号之间提取数据。这样您就不必知道所有可能的变量值 - true、false、undefined、null、3533 等......

// Then:
// safety - put a semicolon before each var, just in case they don't exist at end of line
str = str.replace(/(^|\s*)var /g, '$1;var ');

// extract data between var and ;
// var x   = anything except semicolon;
const regex = /(^|\n)\s*var +([\$\_a-z]\w*) *\=[^\;]*\;/gi;


const result = str.replace(regex, `{{$2}}`);

// remove duplicate semicolon as cleanup. Probably not needed since the above will have replaced them all.
str = str.replace(/\;var /g, 'var');

【讨论】:

    【解决方案2】:

    我能够编写一个满足我要求的正则表达式

    const regex = /(?<!\/\s*?)\bvar\b\s+(.*?)\s*?=\s*?['"{ft].*?['"}e]\s*?;/ gsmi;
    const subst = `{{$1}}`;
    const result = str.replace(regex, subst);
    
    • (?&lt;!\/\s*?) -exclude 匹配如果前面有评论 // var template = test
    • \bvar\b\s+ - 搜索 var 后跟一个或多个空格
    • (.*?)\s*?=\s*? -in 括号中的变量名称等号之前和之后可能是空格
    • ['"{ft] - 查找左引号 '" 或括号 { 或单词 true 或 false
    • .*? -任意字符,这些是变量的值
    • ['"}e] - 查找右引号 '" 或括号 } 或单词 true 或错误e
    • \s*?; - 正在寻找 ; 之前可能有空格

    然后我们可以对错误进行额外检查,检查接收到的实体,它们是字符串、对象还是布尔值...

    下面的正则表达式也处理非分号变量,以及递归嵌套对象,新的正则表达式(?&lt;!\/\s*?)\bvar\b\s+(.*?)\s*?=\s*?(?:(?:\{(?:\{.*?\}|(?!;)[^\{])*\})|(?:\bfalse\b|\btrue\b)|(?:['"][^"|']*['"]))\s*?;?\s*?\n

    帮助我的链接https://stackoverflow.com/a/2563520/14201692 谢谢Sean Huber

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2017-01-30
      • 2017-03-24
      • 2011-07-13
      • 2021-11-29
      • 2016-02-02
      相关资源
      最近更新 更多