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

时间:2014-01-20 13:36:51

标签: javascript regex

为尴尬的问题标题道歉,我有以下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中使用正则表达式的含义:)

1 个答案:

答案 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
  • 如果标签可以包含其他标签,则可能需要一个下降html解析器,因为HTML允许这样做。 在撰写本文时,Javascript不再是递归模式。

演示

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