我有两个变量,一个字符串[var str]和一个单词数组[var exceptions]。我使用以下正则表达式用星号替换长度超过3个字母的每个单词的每个中间字符:
var edited = str.replace(/\B\w\B/g, '*');
例如,字符串“这是我正在做的事情的一个例子”将被返回为“T ** s是w *的一个例子*我不喜欢。
但是,我想在此正则表达式中添加例外。所以例如,我得到了数组(var exceptions = ["example","doing"]
),然后我希望正则表达式返回:“T ** s是我正在做的一个例子”
有谁知道怎么做?如果有一种方法可以使用正则表达式实现这一目标,如果不是,我会接受其他建议。
非常感谢:)
答案 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
- 匹配整个单词example
或doing
并放入捕获组#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);