3

我有这个功能可以找到整个单词并替换它们。它识别空间但不应该替换它们,即不捕获它们。

function asd (sentence, word) {
     str = sentence.replace(new RegExp('(?:^|\\s)' + word + '(?:$|\\s)'), "*****");
     return str;
};

然后我有以下字符串:

var sentence = "ich mag Äpfel";
var word = "Äpfel";

结果应该是这样的:

"ich mag *****" 

并不是:

"ich mag*****"

我得到后者。

我怎样才能让它识别空间但在替换单词时忽略它?

起初这似乎是重复的,但我没有找到这个问题的答案,这就是我问它的原因。

谢谢

4

1 回答 1

5

您应该通过在替换模式中使用带有替换反向引用的捕获组(而不是非捕获组)来放回匹配的空白,并且您还可以利用前瞻来寻找正确的空白边界,这在连续的情况下很方便火柴:

function asd (sentence, word) {
     str = sentence.replace(new RegExp('(^|\\s)' + word + '(?=$|\\s)'), "$1*****");
     return str;
};
var sentence = "ich mag Äpfel";
var word = "Äpfel";
console.log(asd(sentence, word));

请参阅正则表达式演示

细节

  • (^|\s)- 第 1 组(稍后在替换模式中借助$1占位符进行引用):匹配字符串开头或空格的捕获组
  • Äpfel- 一个搜索词
  • (?=$|\s)- 一个正向的前瞻,要求字符串的结尾或空格紧挨当前位置的右侧。

注意:如果word可以包含特殊的正则表达式元字符,请将它们转义

function asd (sentence, word) {
     str = sentence.replace(new RegExp('(^|\\s)' + word.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '(?=$|\\s)'), "$1*****");
     return str;
};
于 2018-04-18T16:23:19.333 回答