【问题标题】:JavaScript.Replace content wrapped in dollar signs ($) outside of HTML tagsJavaScript. 替换 HTML 标记外用美元符号 ($) 包裹的内容
【发布时间】:2026-01-07 07:50:02
【问题描述】:

注意:我不是在尝试使用正则表达式解析 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/

谢谢!

【问题讨论】:

  • 我认为我们需要退后一步。您如何获得正在解析的文本?您要解决的真正问题是什么?
  • 当您谈论包含在 HTML 标记中的内容时,您实际上是在谈论解析 HTML。因为如果不通过解析,您将如何决定 HTML 标签中包含的内容?
  • ...难道不是每个文本都被包裹在一些HTML标签中,实际上?
  • 我认为他的意思是 紧密 包裹,所以它只有一个文本节点作为子节点,nodeValue 以“$”开头和结尾。
  • @mkoryak:我正在解析一个可能包含 HTML 的文本区域以及包含在 $'s 中的特殊文本,我将对此做一些特别的事情;当我在 HTML 标记中有这样的符号时,就会出现一个问题,我不想触摸这些符号。如果我理解正确的话,MaxArt 是对的。我本可以将问题改写为“忽略括号内的内容”,但我认为将其保留在上下文中会更好,因为 HTML 标记是围绕正则表达式的热门讨论。顺便说一句,谢谢!

标签: javascript regex


【解决方案1】:

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

试试这个:

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

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

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

另外,为避免出现上述问题,您应该检查第一美元之后是否没有',所以我在捕获的开头放了一个[^&lt;]团体。这也意味着它不会捕获美元符号之间的空字符串(如'$$'),它们必须至少包含一个字符。

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

【讨论】:

  • (^|[^&gt;]) 组应该是非捕获 (?:^|[^&gt;]) 或者您可以捕获不需要的空间。
  • 您必须捕获它,以便将其放回替换字符串中。否则 &gt; 将被删除。
  • @mcrumley:您的正则表达式不适用于&lt;p&gt;$someone$, &lt;a&gt;$welcome$&lt;/a&gt;, and $another$&lt;/p&gt;
  • 假设你可以有任意嵌套,我会使用这个:(^|[^>])\$[^\$]*\$(?!
  • @DvirAzulay:我不认为 $alpha$$beta$ 没有后视是可能的。