replace
函数返回带有替换的新字符串,但如果没有要替换的单词,则返回原始字符串。除了将结果与原始字符串进行比较之外,有没有办法知道它是否实际上取代了什么?
答案 0 :(得分:24)
一个简单的选择是在替换之前检查匹配:
var regex = /i/g;
var newStr = str;
var replaced = str.search(regex) >= 0;
if(replaced){
newStr = newStr.replace(regex, '!');
}
如果您不想要这样做,您可以滥用replace
回调来实现这一目标:
var replaced = false;
var newStr = str.replace(/i/g, function(token){replaced = true; return '!';});
答案 1 :(得分:2)
比较前后字符串是检查它是否有效的最简单方法,String.replace()
中没有内在支持。
['=='可能因为错误而被删除的例子]
答案 2 :(得分:1)
如果替换的长度与搜索到的文本的长度不同,则可以检查字符串之前和之后的长度。我知道,这是部分响应,仅对问题的一部分有效。
OR
您可以进行搜索。如果搜索成功,则对从找到的索引开始的子字符串执行替换,然后重新构造字符串。这可能会更慢,因为您生成的是3个字符串而不是2个。
var test = "Hellllo";
var index = test.search(/ll/);
if (index >= 0) {
test = test.substr(0, index - 1) + test.substr(index).replace(/ll/g, "tt");
}
alert(test);
答案 3 :(得分:1)
作为一种解决方法,您可以实现自己的回调函数,该函数将设置标志并进行替换。 replacement
的{{1}}参数可以接受函数。
答案 4 :(得分:1)
Javascript replace
被设计叛逃。为什么?它与回调中的字符串替换没有兼容性。
例如:
"ab".replace(/(a)(b)/, "$1$2")
> "ab"
我们要验证替换是在单次传递中完成的。我想象的是:
"ab".replace(/(a)(b)/, "$1$2", function replacing() { console.log('ok'); })
> "ab"
真实变体:
"ab".replace(/(a)(b)/, function replacing() {
console.log('ok');
return "$1$2";
})
> ok
> "$1$2"
但是功能replacing
旨在接收$0, $1, $2, offset, string
,我们必须与替换“$ 1 $ 2”作斗争。解决方案是:
"ab".replace(/(a)(b)/, function replacing() {
console.log('ok');
// arguments are $0, $1, ..., offset, string
return Array.from(arguments).slice(1, -2)
.reduce(function (pattern, match, index) {
// '$1' from strings like '$11 $12' shouldn't be replaced.
return pattern.replace(
new RegExp("\\$" + (index + 1) + "(?=[^\\d]|$)", "g"),
match
);
}, "$1$2");
});
> ok
> "ab"
这个解决方案并不完美。字符串替换本身有自己的WAT。例如:
"a".replace(/(a)/, "$01")
> "a"
"a".replace(/(a)/, "$001")
> "$001"
如果你想关心兼容性,你必须阅读spec并实现其所有的疯狂。
答案 5 :(得分:0)
使用indexOf
,您可以检查字符串是否包含其他字符串
好像你可能想要使用它。
答案 6 :(得分:0)
查看string.match()或string.search()
答案 7 :(得分:0)
使用.test()
const regex = /foo/;
const yourString = 'foo bar';
if (regex.test(yourString)) {
console.log('yourString contains regex');
}