我需要用JavaScript编写解决方案,以将字符串中的所有字符替换为*,除了第一个和最后一个字符。我对RegEx不太熟悉,但尝试使用以下方法来实现解决方案:
var regex = /\.(?=^)(?!=$)/;
const censored = w.replace(regex)
console.log(censored)
关于如何实现这一目标的任何想法?
答案 0 :(得分:4)
使用先行方式的想法是可行的,让我们纠正一些错误:
var regex = /(?<!^).(?!$)/g;
var w = 'fork'
var censored = w.replace(regex, '*')
console.log(censored)
但是请注意,后向(?<=
和?<!
)来自ES 2018,尚未得到普遍支持。 (正如另一个答案中指出的那样,您实际上不需要在此后面进行回顾,也可以进行(?!^)
的回顾)。 Stil ...
您也可以切掉第一个字符并替换其余字符:
var w = 'fork'
var censored = w[0] + w.slice(1).replace(/.(?!$)/g, '*')
console.log(censored)
最后,这是一种完全不需要任何正则表达式的方法:
var w = 'fork'
var censored = w[0] + '*'.repeat(w.length - 1) + w.slice(-1)
console.log(censored)
答案 1 :(得分:1)
这是一种不使用正则表达式的方法:
function censor(str) {
return str[0] + new Array(str.length - 2).join('*') + str[str.length - 1]
}
console.log(censor('happy birthday'))
答案 2 :(得分:0)
您可以使用replace回调作为第二个参数来替换如下项:
const str = 'fork'
var result = str.replace(/^(.)(.+)(.)$/, (whole, first, middle, last) => {
return first + new Array(middle.length).fill('*').join('') + last
})
console.log(result)
答案 3 :(得分:0)
使用符合ECMAScript 5的正则表达式模式非常容易:
var regex = /(?!^)[\s\S](?!$)/g;
var w = "Text!"
var censored = w.replace(regex, "*")
console.log(censored)
详细信息
(?!^)
-前瞻否定:匹配的位置不是字符串的起始位置[\s\S]
-任何字符(甚至是换行符)(?!$)
-超前查询:匹配的位置不是字符串结束位置请参见regex demo。
答案 4 :(得分:0)
如果不是正则表达式,这是一个解决方案。
function censor(input){
return input.split("").map(function(char, index){
if(index === 0 || index === (input.length - 1)){
return char;
} else {
return "*";
}
}).join("");
}
console.log(censor("Hello world"));
答案 5 :(得分:0)
您也可以使用以下代码:
(?<=\w{1})\w(?=\w{1})
其中 ?<=
是正向后视,而 ?=
是正向前瞻