Javascript 正则表达式替换会影响单个单词
Javascript regex replace affects a single word
假设我有一个函数icon_trans(icon)
,它用字符作为输出替换预期的输入。该功能按预期工作正常,但存在一个问题。
当输入用于例如 showers
输出预计'
.
当输入snow moon
或snowmoon
时,输出预期;
。
当输入为太阳时,输出预期为 I。
但是,当输入rain sun
或rainsun
时,输出是I
,而不是预期的%
。
这样做的原因是合乎逻辑的,因为正则表达式正在修补rain
然后sun
并返回I
的 sun char,而不是rainsun
%
的 sun char。
每个包含单词sun
的输入(downpour sun
、rain sun
、flurries sun
等)都会发生同样的情况。
JS小提琴将在问题的末尾。
function icon_trans(icon) {
icon = icon.replace(/'s+/g, ''); // remove whitespace
var mapObj = {
showers:"'",
snowmoon:";",
downpour:"*",
rain:"$",
sleet:"0",
snow:"9",
hail:"5",
downpoursun:"+",
rainsun:"%",
flurries:"6",
flurriessun:"7",
fog:"<",
haze:"?",
lightning:"F",
cloud:"!",
cloudsun:'"',
sun:"I"
};
icon = icon.replace(/showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun/gi, function(matched) {
icVar = mapObj[matched]
});
console.log(icVar);
}
谢谢!
您需要
将替代方案放入分组结构中(我建议使用非捕获组(?:...)
),并在两端设置单词边界'b
:
/'b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)'b/gi
^^^^^ ^^^
查看演示,了解如何将rain sun
替换为%
(如预期):
function icon_trans(icon) {
icon = icon.replace(/'s+/g, ''); // remove whitespace
var mapObj = {
showers:"'",
snowmoon:";",
downpour:"*",
rain:"$",
sleet:"0",
snow:"9",
hail:"5",
downpoursun:"+",
rainsun:"%",
flurries:"6",
flurriessun:"7",
fog:"<",
haze:"?",
lightning:"F",
cloud:"!",
cloudsun:'"',
sun:"I"
};
icon = icon.replace(/'b(?:showers|snowmoon|downpour|rain|sleet|snow|hail|downpoursun|rainsun|flurries|flurriessun|fog|haze|lightning|cloud|cloudsun|sun)'b/gi, function(matched) {
icVar = mapObj[matched]
});
document.body.innerHTML = icVar;
}
icon_trans("rain sun");
您的正则表达式基本上以非常复杂的方式mapObj[icon]
。
function icon_trans(icon) {
icon = icon.replace(/'s+/g, ''); // remove whitespace
var mapObj = {...};
return mapObj[icon];
}
如果您坚持使用正则表达式,这里有一种不那么笨拙的方法:
icon = icon.replace(/'s+/g, '');
var re = new RegExp('''b(' + Object.keys(mapObj).join('|') + ')''b', 'i');
var m = icon.match(re);
return mapObj[m[1]];
相关文章:
- 是否可以禁用jquery中的单个单选按钮
- 单个页面上有多个标记表单
- 如何使用单个表单填写多个表单
- 如何从单选按钮中获取多个值,然后将它们分配到单个变量中并在页面上显示
- 多个表单触发到单个工作表
- 什么 在单个页面上创建具有 php 多步骤的多个表单
- 多个单选按钮窗体、单个组无法检索值
- 针对各种选择框更改验证单个表单的特定字段-jQuery
- 自定义右键单击UI上下文菜单(复制、粘贴、剪切)用于整个应用程序(所有网页)跨所有浏览器而非单个网页
- Javascript表单验证-如何在单个表中显示验证错误,而不是使用警报
- 通过单击Href将单个表单值发布到自身
- 触发单个单击事件时触发的所有单击事件处理程序
- javascript禁用单个单选按钮
- 如何在单击按钮后再次动态单击按钮(将单个单击视为双击)
- 在页面加载时保持单个单选按钮未选中
- jQuery——一个表单影响另一个表单
- 如何在 reactjs 中设置单个单击事件的状态和 props
- 当将单个单击事件绑定到多个按钮时,我如何使被单击的按钮做一件事而所有其他按钮做另一件事?
- 如何使用jquery/java脚本检查单个单选按钮
- 我可以在单个单击事件上触发多个函数吗?