gpt4 book ai didi

javascript - 正则表达式似乎忽略了多个管道字符

转载 作者:行者123 更新时间:2023-11-30 05:40:12 24 4
gpt4 key购买 nike

对于尴尬的问题标题表示歉意,我有以下 JavaScript:

var wordRe = new RegExp('\\b(?:(?![<^>"])fox|hello(?![<\/">]))\\b', 'g'); // Words regex

console.log('<span>hello</span> <hello>fox</hello> <a href="hello">fox link</a> hello my name is fox'.replace(wordRe, 'foo'));

我想要做的是替换任何没有嵌套在 HTML 标签中的词,或者替换 HTML 标签本身的一部分。即我只想匹配“纯”文本。该表达式似乎忽略了第一个管道匹配“fox”的规则,并在不应该的时候替换它。

谁能指出这是为什么?我想我可能错误地组织了表达式(至少是负面的前瞻)。

这是 JSFiddle .

我还想补充一点,我知道在 HTML 中使用正则表达式的含义 :)

最佳答案

对于您的正则表达式工作,您需要lookbehind。但是,在撰写本文时,Javascript 不支持此功能。

解决方法如下:

我们将匹配我们想要的,而不是匹配我们想要的,并将其从我们的输入字符串中删除。稍后,我们可以对清理后的输入字符串执行替换。

var nonWordRe = new RegExp('<([^>]+).*?>[^<]+?</\\1>', 'g');
var test = '<span>hello</span> <hello>fox</hello> <a href="hello">fox link</a> hello my name is fox';

var cleanedTest = test.replace(nonWordRe, '');

var final = cleanedTest.replace(/fox|hello/, 'foo'); // once trimmed final=='foo my name is foo'


注意:

我已根据您的示例构建了此解决方法。但是如果你面对它们,这里有一些可能需要探索的点:

  • 您可能需要从测试字符串中删除自闭标签 (<([^>]+).*?/\>)
  • 您可能需要 trim 最后的字符串 ( final )
  • 如果标签可以包含其他标签,因为 HTML 允许这样做,您可能需要一个下降的 html 解析器。在撰写本文时,Javascript 没有递归模式。

演示

http://jsfiddle.net/yXd82/2/

关于javascript - 正则表达式似乎忽略了多个管道字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21235517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com