在Javascript

时间:2016-08-09 11:16:42

标签: javascript arrays regex replace

我有两个变量,一个字符串[var str]和一个单词数组[var exceptions]。我使用以下正则表达式用星号替换长度超过3个字母的每个单词的每个中间字符:

 var edited = str.replace(/\B\w\B/g, '*');

例如,字符串“这是我正在做的事情的一个例子”将被返回为“T ** s是w *的一个例子*我不喜欢

但是,我想在此正则表达式中添加例外。所以例如,我得到了数组(var exceptions = ["example","doing"]),然后我希望正则表达式返回:“T ** s是我正在做的一个例子”

有谁知道怎么做?如果有一种方法可以使用正则表达式实现这一目标,如果不是,我会接受其他建议。

非常感谢:)

4 个答案:

答案 0 :(得分:2)

您可以使用例外词 - 我看到它们都包含单词字符 - 作为一个替换组并将其捕获到组1中,然后在replace回调中恢复它们。

正则表达式看起来像

/\b(example|doing)\b|\B\w\B/g

参见JS演示:

var exceptions = ["example","doing"];
var rx = new RegExp("\\b(" + exceptions.join("|") + ")\\b|\\B\\w\\B", "g");
var s = "This is an example of what I am doing";
var res = s.replace(rx, function ($0, $1) {
  return $1 ? $1 : '*';
});
console.log(res);

模式详情

  • \b(example|doing)\b - 匹配整个单词exampledoing并放入捕获组#1以便稍后在结果中恢复
  • | - 或
  • \B\w\B - 匹配其他单词字符中的单词字符(来自[a-zA-Z0-9_]集)。

答案 1 :(得分:1)

.split(" ")分隔单词分隔句子。然后对于每个单词,检查它是否在异常数组中,如果不是,只需将其添加到newString而不进行更改。如果不是,请应用正则表达式。

 var newString = "";
 var exceptions = ["test"];
  "this is a test".split(" ").forEach(word =>{
       if(exceptions.includes(word))
         newString += word + " ";
       else
          newString += word.replace(/\B\w\B/g, '*') + " ";
   });

console.log(newString)

答案 2 :(得分:1)

我可能会将排除数组转换为地图,这样我就可以更快地检查单词是否在数组中。然后我会使用replace函数接受替换函数的事实,并在那里做出决定:

var exclude = ["example", "what"];
var str = "This is an example of what I am doing";

var map = Object.create(null);
exclude.forEach(function(entry) {
  map[entry] = true;
});
var edited = str.replace(/\b(\w)(\w+)(\w)\b/g, function(m, c0, c1, c2) {
  return map[m] ? m : c0 + "*".repeat(c1.length) + c2;
});
console.log(edited);

我在上面使用了String#repeat,它来自ES2015,但是对于旧版浏览器可以轻松填充。或者改为使用c1.replace(/./g, "*")

这是一个ES2015 +版本,使用Set而不是对象图:

let exclude = ["example", "what"];
let str = "This is an example of what I am doing";

let set = new Set();
exclude.forEach(entry => {
  set.add(entry);
});
let edited = str.replace(/\b(\w)(\w+)(\w)\b/g, (m, c0, c1, c2) =>
  set.has(m) ? m : c0 + "*".repeat(c1.length) + c2
);
console.log(edited);

答案 3 :(得分:1)

你可以这样做,假设单词总是以空格分隔:

var str = "This is an example of what I am doing";
var exceptions = [ "example", "doing" ];

var edited = str.split(' ').map(function(w) {
  return exceptions.indexOf(w) != -1 ? w : w.replace(/\B\w\B/g, '*');
}).join(' ');

console.log(edited);