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初始值设定项,我是否做错了什么?因为那对我来说像个虫子,TBHwordBoundary
您必须将反斜杠加倍:
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|$|/|\\?|\\.|\\!|\\ )";