【问题标题】:Non-capturing group matching whitespace boundaries in JavaScript regexJavaScript 正则表达式中的非捕获组匹配空白边界
【发布时间】:2018-09-28 23:31:25
【问题描述】:

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

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

我是后者。

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

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

谢谢

【问题讨论】:

    标签: javascript regex replace word-boundaries


    【解决方案1】:

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

    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;
    };
    

    【讨论】:

    • 你知道我怎样才能让它以连字符开头而不是字符串或空格开头的单词来计算吗?示例:在“ich gehe ins Fitness-studio”中查找并替换“studio”为“****”
    • @N.Car 您可以将其添加到左边界:(^|\\s) -> (^|[-\\s])。如果您决定实现 Unicode 字边界,问题会更大,因为最好的方法是使用 XRegExp(如果您计划支持所有浏览器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多