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;
};
我有这个功能可以找到完整的单词并替换它们。它识别 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;
};