JavaScript 正则表达式中的非捕获组匹配空白边界

Non-capturing group matching whitespace boundaries in JavaScript regex

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

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*****"

我要后者。

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

乍一看这似乎是重复的,但我没有找到这个问题的答案,这就是我问这个问题的原因。

谢谢

您应该使用 捕获 组(而不是 非捕获 组)和替换反向引用来放回匹配的空格在替换模式中,您还可以利用右空白边界的前瞻性,这在连续匹配的情况下很方便:

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

参见regex demo

详情

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

注意:如果word可以包含特殊的正则表达式元字符,escape them:

function asd (sentence, word) {
     str = sentence.replace(new RegExp('(^|\s)' + word.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&') + '(?=$|\s)'), "*****");
     return str;
};