替换 $& 正则表达式组
Replace $& regex group
Boris Moore 出色的 jsrender 库 has one bug。我既不完全理解 $&
(lastMatch) 在正则表达式替换组中的含义,也不知道如何解决。
这篇文章告诉我 to not use the function in production environments,并间接告诉我不要使用 JsRender
直播。
任何人都可以向我解释一下并替换该行:
tmplFn(tmplOrMarkup.replace(rEscapeQuotes, "\$&"), tmpl);
此致
编辑:绝望
不幸的是JsRender和JDK离开了另一个抱着孩子。 JsRender 说:$% 工作正常,JDK 说从未指定也不是错误。
这实际上不是错误。您 link 阅读的 MDN 文章适用于非标准 RegEx.lastMatch()
API,这是一种访问最后一场比赛的编程方式。但是 JsRender 没有使用 API.
事实上,JsRender 在 someString.replace(regex, replacementstring)
调用中使用 "$&"
作为替换字符串中的替换模式 - 这是 JavaScript RegEx 场景中的标准用法。
参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace,其中写着:
The replacement string can include the following special replacement patterns: ... $& Inserts the matched substring.
该行代码中的正则表达式是 rEscapeQuotes,声明为 rEscapeQuotes = /['"\]/g
- 并且是有效的 JavaScript 正则表达式。
该行正在查找 '
"
或 \
并将它们替换为前面带有 \
的相同字符。
顺便说一下,您不应该尝试 运行 JsRender 中使用的相同正则表达式,就好像它们是 Java 正则表达式一样,因为在 Java 中正则表达式的规则和有效性可以完全不同。 JsRender 当然 运行 在 Java 脚本环境中 - 浏览器,或 Node.js 在服务器上...
Boris Moore 出色的 jsrender 库 has one bug。我既不完全理解 $&
(lastMatch) 在正则表达式替换组中的含义,也不知道如何解决。
这篇文章告诉我 to not use the function in production environments,并间接告诉我不要使用 JsRender
直播。
任何人都可以向我解释一下并替换该行:
tmplFn(tmplOrMarkup.replace(rEscapeQuotes, "\$&"), tmpl);
此致
编辑:绝望
不幸的是JsRender和JDK离开了另一个抱着孩子。 JsRender 说:$% 工作正常,JDK 说从未指定也不是错误。
这实际上不是错误。您 link 阅读的 MDN 文章适用于非标准 RegEx.lastMatch()
API,这是一种访问最后一场比赛的编程方式。但是 JsRender 没有使用 API.
事实上,JsRender 在 someString.replace(regex, replacementstring)
调用中使用 "$&"
作为替换字符串中的替换模式 - 这是 JavaScript RegEx 场景中的标准用法。
参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace,其中写着:
The replacement string can include the following special replacement patterns: ... $& Inserts the matched substring.
该行代码中的正则表达式是 rEscapeQuotes,声明为 rEscapeQuotes = /['"\]/g
- 并且是有效的 JavaScript 正则表达式。
该行正在查找 '
"
或 \
并将它们替换为前面带有 \
的相同字符。
顺便说一下,您不应该尝试 运行 JsRender 中使用的相同正则表达式,就好像它们是 Java 正则表达式一样,因为在 Java 中正则表达式的规则和有效性可以完全不同。 JsRender 当然 运行 在 Java 脚本环境中 - 浏览器,或 Node.js 在服务器上...