为尴尬的问题标题道歉,我有以下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标记本身的一部分。我只想匹配“普通”文本。表达式似乎忽略了第一个管道匹配“狐狸”的规则,并在不应该的时候替换它。
任何人都可以指出这是为什么吗?我想我可能错误地组织了表达式(至少是负向前瞻)。
这是JSFiddle。
我还想补充一点,我知道在HTML中使用正则表达式的含义:)
答案 0 :(得分:1)
对于正则表达式的工作,您需要 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'
的 NOTA:强>
我已根据您的示例构建此变通方法。但是,如果您面对这些问题,可能需要探讨以下几点:
<([^>]+).*?/\>
)final
)