如何知道JavaScript string.replace()是否做了什么?

时间:2011-03-10 08:12:00

标签: javascript regex replace

replace函数返回带有替换的新字符串,但如果没有要替换的单词,则返回原始字符串。除了将结果与原始字符串进行比较之外,有没有办法知道它是否实际上取代了什么?

8 个答案:

答案 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');
}

The test() method executes a search for a match between a regular expression and a specified string. Returns true or false