正则表达式非捕获组

时间:2018-04-18 16:20:13

标签: javascript regex replace word-boundaries

我有这个功能找到整个单词,应该替换它们。它标识空格但不应替换它们,即不捕获它们。

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

然后我有以下字符串:

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

结果应该是这样的:

"ich mag *****" 

和NOT:

"ich mag*****"

我得到了后者。

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

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

谢谢

1 个答案:

答案 0 :(得分: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));




请参阅regex demo

<强>详情

  • (^|\s) - 第1组(后来在替换模式中使用$1占位符引用):匹配字符串开头或空格的捕获组
  • Äpfel - 搜索词
  • (?=$|\s) - 一个积极的前瞻,需要在当前位置的右侧立即结束字符串或空格。

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

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