4

注意:我不是在尝试用正则表达式解析 HTML

我正在尝试替换字符串中包含在 $ 符号($for example$)中的任何内容。我设法想出了str.replace(/\$([^\$]*)\$/g), "hello $1!"),但是我在确保在将此类字符串包装在 HTML 标记中时不替换它们时遇到了问题。

示例字符串:$someone$, <a>$welcome$</a>, and $another$

表达:/[^>]\$([^\$]*)\$[^<]/g

预期输出:hello someone!, <a>$welcome</a>, and hello another!

实际输出:$someonhello , !elcomhello , and !nother$

测试代码:alert("$someone$, <a>$welcome$</a>, and $another$".replace(/[^>]\$([^\$]*)\$[^<]/g, "hello $1!"));

小提琴:http: //jsfiddle.net/WMWHZ/

谢谢!

4

1 回答 1

4

请记住,您的测试用例中有 6 个“$”。这里的问题是,当您尝试检查前一个字符是否不是“>”时,正则表达式会向前移动并匹配第 4 个和第5 个美元符号之间的内容,"</a>, and "从而捕获并弄得一团糟。

试试这个:

$('div').text(test.replace(/(^|[^>])\$([^<][^\$]*)\$(?!<)/g, "$1hello $2!"))​

Javascript 不支持正则表达式中的lookbehinds,但它支持lookaheads((?!<)部分)。为了模拟lookbehinds,您正确地尝试放在[^>]美元之前,但随后字符匹配,因此您必须抓住它并再次将其放入字符串中。

您只需要稍微改进它,因为如果 '$' 位于字符串的开头,则不会捕获该组。

此外,为避免上述问题,您应该检查第一美元之后是否没有“<” ,因此我[^<]在捕获组的开头放置了一个。这也意味着它不会捕获美元符号之间的空字符串(如'$$'),它们必须至少包含一个字符。

这样,您就有了预期的结果。

于 2012-05-24T15:01:59.957 回答