Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据映射-JS替换字符串中的某些值_Javascript_Regex_String - Fatal编程技术网

Javascript 根据映射-JS替换字符串中的某些值

Javascript 根据映射-JS替换字符串中的某些值,javascript,regex,string,Javascript,Regex,String,我有一个字符串,后面跟一个冒号。我需要用对象中的值替换该字符串中的冒号。我能够提取冒号词,但不确定在字符串中替换冒号的最佳方法 这就是我所拥有的: 常量字符串='这是:state:buttonName by:name'; const buttonName='按钮链接'; 常数数据={ 州:“阿拉巴马州”, 姓名:“阿伦” } const res=string.match/:[a-zA-Z]+/g.mapi=>i.replace':', 控制台。logres //这是Arun的Alabama按钮

我有一个字符串,后面跟一个冒号。我需要用对象中的值替换该字符串中的冒号。我能够提取冒号词,但不确定在字符串中替换冒号的最佳方法

这就是我所拥有的:

常量字符串='这是:state:buttonName by:name'; const buttonName='按钮链接'; 常数数据={ 州:“阿拉巴马州”, 姓名:“阿伦” } const res=string.match/:[a-zA-Z]+/g.mapi=>i.replace':', 控制台。logres //这是Arun的Alabama按钮链接您可以拆分字符串,然后调用数组映射来替换单词并连接到最终字符串

const str= 'This is :state :buttonName by :name';

str.split(' ').map(a => {
                         if(a.startsWith(":"))
                           return data[a.replace(":","")]; 
   
                         return a;
                  }).join(' ');

如果已经从字符串中删除了:,则可以迭代对象键并用相应的值替换它们

...
const res = string.match(/:[a-zA-Z]+/g).map(i => i.replace(':', ''))

for (const [key, value] of Object.entries(data)) {
    res = res.replaceAll(key, value);
}

首先,您需要移动constbuttonname='buttonlink';到阵列

您需要使用Stringreplace,但还需要捕获正则表达式的after:部分,并实际使用Group 1值作为键来获取正确的数据值

此外,您需要检查提取的密钥是否在字典中,以避免出现问题

你可以用

常量字符串='这是:state:buttonName by:name'; 常数数据={ 按钮名称:“按钮链接”, 州:“阿拉巴马州”, 姓名:“阿伦” } const res=string.replace/:[a-zA-Z]+/g,m,i=>i在数据中?数据[i]:m
console.logresWiktor的答案很好。但是如果它也需要替换全局变量,我们可以编写如下代码

const res = string.replace(/:([a-zA-Z_]+)/g, (m, i) => data[i] ?? eval(i) ?? m);
console.log(res)
此代码尚未执行异常处理。应该考虑一下。所以我们可以定义一个替换函数来处理异常

const replacer = (m, i) => {
    try {
        return data[i] ?? eval(i);
    } catch {
        return m;
    }
}

const res = string.replace(/:([a-zA-Z_]+)/g, replacer);

这回答了你的问题吗?us regex global flag replace/:/g,当然它不是此处的副本,问题在于匹配特定格式的标记,这些标记以:开头,然后只包含字母,而不是该线程中的情况,并将其替换为字典中的项目。一点关系也没有。