Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript RegExp行为异常_Javascript_Regex_Replace - Fatal编程技术网

JavaScript RegExp行为异常

JavaScript RegExp行为异常,javascript,regex,replace,Javascript,Regex,Replace,我的目标是突出女性名词(德语),将它们包装成带有特定class=“…”样式的标记 当我处理一个非ASCII集时(不幸的是)不能在JavaScript的正则表达式中使用“Word边界” \b/COD>,因此我被迫即兴列出我认为是单词边界的词。 我的代码(简化和精简)如下所示: const wordBoundary = "(^|\\s|$|/|\\?|\\.|\\!|\\ )"; "Liebe Grüße".replace( new RegExp(`${wordBoundary}(Liebe

我的目标是突出女性名词(德语),将它们包装成带有特定
class=“…”
样式的
标记

当我处理一个非ASCII集时(不幸的是)不能在JavaScript的正则表达式中使用“Word边界”<代码> \b/COD>,因此我被迫即兴列出我认为是单词边界的词。 我的代码(简化和精简)如下所示:

const wordBoundary = "(^|\\s|$|/|\\?|\\.|\\!|\\ )";
"Liebe Grüße".replace(
    new RegExp(`${wordBoundary}(Liebe|Grüße)${wordBoundary}`, "g"),
    `<span class="nounF">$1$2$3</span>`
);
我的问题有两个方面:

  • 通过创建
    RegExp
    对象而不使用就地regex初始值设定项,我是否做错了什么?因为那对我来说像个虫子,TBH
  • 如果我被迫使用regex初始值设定项-我如何为它提供自定义的
    wordBoundary

  • 您必须将反斜杠加倍:

    const wordBoundary = "(^|\\\\s|$|/|\\\\?|\\\\.|\\\\!|\\\\ )";
    
    这是因为(在您的场景中)变量
    wordBoundary
    包含正确转义的反斜杠(
    \\
    ),但当您在
    ${…}
    中再次重用该变量时,您将丢失转义(所有
    \\
    都已成为
    \
    ,现在转义其他字符)。RegExp literal完全避免了这个问题


    编辑:这是完全错误的,但是如果你正在读这个,仍然不知道正确的答案,花一分钟想想为什么它是错误的。
    const wordBoundary = "(^|\\s|$|/|\\?|\\.|\\!|\\ )";
    
    与其他地方断言的相反,此正确转义。这不一定是最好的写作方式,但它会起作用。结尾的空格不需要
    \\)
    ,因为它已经被
    \\s
    >覆盖了,您也不需要退出
    ,但不会有任何伤害

    让我们考虑一个类似的例子,只使用ASCII:

    const wordBoundary=“(^ | \\s |$$\124;/| \?| \.| \!| \”);
    console.log(
    “catdog”.match(新的RegExp(`${wordBoundary}(catdog)${wordBoundary}`,'g'))
    
    );您对当前的单词边界符号满意吗?如果是,请使用
    newregexp(`${wordBoundary}(Liebe | Grü223; e)(?=$|[/?。!\\s])`,“g”)
    。或者将第二个
    ${wordBoundary}
    替换为
    (?=${wordBoundary})
    ,如果您已经知道Liebe和Grüße单词来创建一个RegExp对象,那么您为什么要使用regex来执行此任务呢?因为这是一个更大代码的非常短的版本
    \w
    是一个单词字符而不是单词边界(
    \b
    )“Liebe Grüße”。替换(/\b(Liebe Grüße)\b/g,
    $1
    );似乎很好。哦,我现在理解了这个问题,谢谢。我不相信这是正确的。使用
    ${…}
    不会删除某个级别的转义。我已经尝试解释了为什么它在我的答案中有效。哦,天哪,这确实是正确的答案,应该被标记为正确答案。更不用说list
    […]
    更优雅有效的解决方案了。感谢您的详细解释!感谢您的详细解释(我希望有人能教我)。我很高兴肯定的前瞻在JS中起作用(我在其他地方读过,可能是在MDN?上,这些在javascript中不受支持)@YePhIcK Lookbehinds不受支持,这可能是你读到的。
    const wordBoundary = "(^|\\s|$|/|\\?|\\.|\\!|\\ )";