作为Java的高度定制豪华版,Apex的String对象提供了三个与字符串替换相关的函数,replace(), replaceAll(), replaceFirst()。其中replace负责用字符串进行替换,replaceAll()负责用正则表达式进行替换,replaceFisrt负责用正则表达式替换第一个匹配到的结果。
在Apex范畴,这三个方法已经足够日常使用。但是在Javascript领域状况有所不同。
在Javascript中也有个函数叫做replace(),但却复杂很多。
首先引用来自官方文档的例子
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; const regex = /dog/gi; console.log(p.replace(regex, 'ferret')); // expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?" console.log(p.replace('dog', 'monkey')); // expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"
Javascipt的replace同时支持字符串替换与正则表达式替换,并且支持特殊替换符等高级功能。
但是,此replace却非彼replace。
Apex的replace使用字符串替模式会更加直白一些,直接使用 a.replace(b,c); 就能将a中的b替换成c,注意,是所有的b都被替换c。
而Javascript的字符串替换模式则仅替换第一个匹配项。与Apex的replaceFirst方法效果等同。
这样的话,在Lightning Component中如果打算实现与Apex中的replace一样的效果,就需要启用正则表达式模式。
在Helper添加如下方法:
replace : function(content, reg, replacement, isCaseSensitive) { let mode = 'g'; if(!isCaseSensitive) { mode = mode + 'i'; } let re = new RegExp(reg, mode); if(content !== null && content !== undefined && content !== "") { content = content.replace(re, replacement); } return content; }
虽然无法像原生方法一样直接写成a.replace(b,c); 但好在仍然是一行代码调用。
init : function(component, event, helper) { const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; const reg = 'Dog'; const replacement = 'ferret'; let result = helper.replace(p, reg, replacement); console.log('result', result); // result The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy? }
如果需要打开大小写敏感模式,则直接增加第四个参数 helper.replace(p, reg, replacement, true); 即可。