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,因为它不应该匹配,所以它是正确的。