Anki是一款记忆辅助软件,它支持用户自己用HTML/CSS/JS来DIY背单词界面
单词的释义由第三方字典生成,然后再导入Anki,为了达到想要的显示效果,需要对导入的文本进行大量的字符替换,这也是使用正则表达式的好机会。
image.png
现将实践中用到的技巧总结如下:

1. replace的使用

replace的第二个参数除了接受一个字符串,还可以接受一个函数,且支持连续调用

  1. div.innerHTML = div.innerHTML.replace(/\b[a-z]+\./g, function(symbol) {
  2. if(colorMap[symbol]) {
  3. return '<br/><a style="background-color:' + colorMap[symbol] +
  4. ';border-radius: 4px; color:white; padding:0 3px;margin-right:5px">'+
  5. symbol + '</a>';
  6. } else {
  7. return symbol;
  8. }
  9. }).replace(/\],/g, ']&nbsp&nbsp')
  10. .replace(/(<br\/?>)+/g, '<br/>')

2. new RegExp

Anki有一个bug,如果用正则/\[/g来替换[符号,会导致页面闪烁,而用RegExp构造函数则不会
RegExp的第一个参数接受/.*/g的形式,也接受字符串,如果给RegExp传字符串,转义需要用\, 因为字符串本身会吞掉一个\

  1. div.innerHTML = div.innerHTML.replace(new RegExp('\\[', 'g'), '/')

3. 前瞻断言 排除字符串

正则表达式如果要排除字符串,需要用到前瞻断言,比如我想要结果中不包含 <a,我的表达式如下:

  1. /[美英]((?!<a\s).)*\]/g

参考文章