javascript 正则表达式替换特殊字符,但允许白名单,使用 xregexp

javascript regular expression to replace special characters, but allow a whitelist, using xregexp

我想替换字符串中的大多数特殊字符(在 javascript 中),但允许一些特殊情况,例如 c++、c# 等。我已经在 node.js 中尝试了 xregexp 库,我认为我能够删除所有非字母和数字。我还想允许所有外语字母。这是我目前所拥有的:

  var str = "I do programming in c++ and sometimes c#, but + and # should be removed";
  regex = XRegExp('[^\s\p{N}\p{L}]+', 'g');
  var replaced = XRegExp.replace(str, regex, "");
  console.log(replaced); 

这输出

I do programming in c and sometimes c, but and should be removed

我需要创建某种包含允许的词的列表,例如 c++ 和 c#。期望的输出是:

I do programming in c++ and sometimes c#, but and should be removed

您可以只在捕获组内使用交替,然后在替换模式中使用反向引用恢复此文本:

var str = "I do programming in c++ and sometimes c#, but + and # should be removed";
regex = XRegExp('(\b(?:c[+]{2}|c#)(?!\w))|[^\s\p{N}\p{L}]+', 'ig');
//               ^-- capture group 1 -----^                        ^  
var replaced = XRegExp.replace(str, regex, "");
//                                          ^^
console.log(replaced);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-all-min.js"></script>

注意我添加了一个 i 标志来使模式不区分大小写,\b 在交替的开头只匹配单词边界(因为 c++c# 以字母(单词字符)开头,前瞻 (?!\w) 确保 +# 之后没有单词字符(\b 在这里不起作用因为这些不是单词字符)。