Javascript 用string.replace替换变量名(regex,value)
尝试做我认为相当简单的字符串替换,但结果比我想象的要复杂 如果我有一根像Javascript 用string.replace替换变量名(regex,value),javascript,regex,ecmascript-2018,Javascript,Regex,Ecmascript 2018,尝试做我认为相当简单的字符串替换,但结果比我想象的要复杂 如果我有一根像 months + 3 + (startmonths * 3) + months - (months*7) + (monthsend*5) 为清楚起见,我正在解析的“公式”是用户提供的,它可以由用户能够想到的任何一系列变量名称和运算符(+*/-)以及参数组成。我需要做的是首先用数字替换变量,然后计算结果表达式 我正在寻找的是如何使用string.replace函数将所有出现的单词months替换为,比如“12” 希望函数的
months + 3 + (startmonths * 3) + months - (months*7) + (monthsend*5)
为清楚起见,我正在解析的“公式”是用户提供的,它可以由用户能够想到的任何一系列变量名称和运算符(+*/-)以及参数组成。我需要做的是首先用数字替换变量,然后计算结果表达式
我正在寻找的是如何使用string.replace函数将所有出现的单词months替换为,比如“12”
希望函数的输出是
12 + 3 + (startmonths * 3) + 12 - (12*3) + (monthsend*5)"
似乎我需要一个正则表达式来避免替换“startmonths”之类的字符串,我可能觉得用javascript正则表达式实际上是不可能的,因为在现代浏览器中很少支持“lookbehinds”
我试着用
[^A-Za-z9-9](月)(?:[^A-Za-z0-9])
但它捕获了“月”之前和之后的字符,因此我不能将其用作string.replace的参数
是否有一些解决方法,或者我是否必须忘记替换功能,并通过查找和拼接等“手动”完成它?这似乎可以在不需要向后看或向前看的情况下工作:
let regExMonth=/\b months\b/gm;
设str=“月+3+(开始月*3)+月-(月*7)+(月底*5)”;
str=str.replace(regExMonth,“12”);
console.log(str)代码>您可以同时使用负向前看和向后看
const regex = /(?<![\w+])(months)(?![\w+])/gm;
const str = `months + 3 + (startmonths * 3) + months - (months*7) + (monthsend*5)`;
const subst = `12`;
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
const regex=/(?我可以建议(^ |[^a-z])月份
说明:
(^ |[^a-z])
-匹配字符串的开头^
或(由于交替|
)除字母以外的其他字符,因为否定字符类[^a-z]
,最后,将其存储在第一个捕获组中
month
=按字面意思匹配month
编辑:小更正:(^ |[^a-z])月($|[^a-z])
$
-匹配字符串的结尾
将其替换为\112\2
-\1
-第一个cuptruing组,\2
-第二个捕获组您使用的编程语言是什么?typescript还是javascript。如果我有一个类似
的字符串……我们确实需要在这里看到几个具体的实际示例。如果它适用于我提供的示例字符串,那么在几乎所有的基础上。例如/b不能与(月*7)一起工作,我不认为。s.replace(/\bmmonths\b/g,12)
?输出是12+3+(startmonths*3)+12-(12*7)+(monthsend*5)
我将查看链接。我实际上正在寻找使用正则表达式来解析用户提供的“公式”的含义其中有“变量”如天、月和小时,用户提供了类似vaslue的“(小时*6)+天”,并在其他地方定义了小时和天的值。因此,它就像一个没有函数的非常简单的电子表格公式解析器。我喜欢\w
对[a-Za-z0-9]的缩写
。但是,后面的加号可能是不必要的。例如,(?也完成了任务。在中,(^ |[^a-z])月
捕获(month
在(monthsend*5)
,这是一个假阳性。在中,添加($|[^a-z]))
结尾导致它不匹配。不过这是一个有趣的方法。@Lonniebeast,因为它不应该匹配,所以它是正确的。