我有这个代码:
let x = "the *quick* brown fox";
let y = x.replace(/[^\\](\*)(.*)(\*)/g, "<strong>$2</strong>");
console.log(y);
它取代了 *quick*
与 <strong>quick</strong>
问题是我还想用反斜杠来转义它,这样 \*quick*
不会转换为 <strong>quick</strong>
我通过要求前一个字符不是正则表达式中的斜杠来做到这一点。
不幸的是,这也消除了结果中的那个字符。
所以结果最终是:
the<strong>quick</strong> brown fox
(注意缺少的空间)
我想也许我可以将正则表达式的后半部分包装在一个捕获组中并仅替换它,但据我所知,Javascript 的替换功能仅适用于完整匹配。
有办法解决这个问题吗?我避免使用成熟的 markdown 库,因为我只需要处理少数情况(粗体和斜体),所以我尽量保持简单。
最佳答案
使用负向回顾,这样 Angular 色就不会被包含在匹配中。这也将允许它匹配字符串的开头(您的正则表达式要求匹配前有一个字符)。
let x = "the *quick* brown fox";
let y = x.replace(/(?<!\\)(\*)(.*)(\*)/g, "<strong>$2</strong>");
console.log(y);
x = "the \\*quick* brown fox";
y = x.replace(/(?<!\\)(\*)(.*)(\*)/g, "<strong>$2</strong>");
console.log(y);
Negative lookbehinds 是一个新的 JavaScript 特性,如果你必须支持旧的浏览器,把它前面的字符放到另一个捕获组中,然后复制到替换中。解决开头匹配问题,要么匹配字符串开头,要么匹配非反斜杠。
let x = "the \\*quick* brown fox";
let y = x.replace(/(^|[^\\])(\*)(.*)(\*)/g, "$1<strong>$3</strong>");
console.log(y);
x = "the *quick* brown fox";
y = x.replace(/(^|[^\\])(\*)(.*)(\*)/g, "$1<strong>$3</strong>");
console.log(y);
关于javascript - 如何替换捕获组而不是 RegEx 中的完整匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931139/