javascript - 如果前面没有反斜杠,如何匹配粗体 Markdown ?

标签 javascript regex markdown regex-lookarounds negative-lookbehind

我正在寻找匹配粗体 Markdown 。以下是一些示例:

qwer *asdf* zxcv匹配*asdf*

qwer*asdf*zxcv匹配*asdf*

qwer \*asdf* zxcv不匹配

*qwer* asdf zxcv匹配*qwer*

像这样负面的目光(?<!\\)\*(.*)\*有效。

只不过 Firefox 不支持浏览器,所以我无法使用它。

同样,我可以非常接近 (^|[^\\])\*(.*)\*

问题是有两个捕获组,我需要第二个捕获组的索引,而Javascript仅返回第一个捕获组的索引。在这种情况下,我可以通过添加 1 来创可贴它,但在其他情况下,此 hack 将不起作用。

我这样做的原因是我试图用 React 组件替换 Markdown 的一小部分。例如,我正在尝试转换此字符串:

qwer *asdf* zxcv *123*

进入这个数组:

[ "qwer ", <strong>asdf</strong>, " zxcv ", <strong>123</strong> ]

其中第二个和第四个元素是通过 JSX 创建的,并作为数组元素包含在内。

最佳答案

您还需要考虑到,当反斜杠出现在星号之前时,它本身可能会被反斜杠转义,在这种情况下,星号应该被视为开始的粗体标记。除非该前面还有反斜杠,...等等。

所以我建议使用这个正则表达式:

((?:^|[^\\])(?:\\.)*)\*((\\.|[^*])*)\*

如果目的是用标签替换它们,例如 <strong> ... </strong> ,然后只需使用 JavaScript 的 replace如下:

let s = String.raw`now *this is bold*, and \\*this too\\*, but \\\*this\* not`;
console.log(s);

let regex = /((?:^|[^\\])(?:\\.)*)\*((\\.|[^*])*)\*/g;
let res = s.replace(regex, "$1<strong>$2</strong>");
console.log(res);

如果粗体字应该转换为 React 组件并与其他纯文本片段一起存储在数组中,那么您可以使用 splitmap :

let s = String.raw`now *this is bold*, and \\*this too\\*, but \\\*this\* not`;
console.log(s);

let regex = /((?:^|[^\\])(?:\\.)*)\*((?:\\.|[^*])*)\*/g;
let res = s.split(regex).map((s, i) =>
    i%3 === 2 ? React.createComponent("strong", {}, s) : s
);

由于 split 的“分隔符”中有两个捕获组调用,一个包含前面的字符,第二个包含单词本身,split 中的每三个项目结果是一个要加粗的单词,因此 i%3表达。

关于javascript - 如果前面没有反斜杠,如何匹配粗体 Markdown ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201967/

相关文章:

javascript - 在 Javascript 中创建嵌套 div 的最有效方法是什么?

java - 根据位置提取双引号之间的单词

python - Vbscript 函数/子调用的正则表达式

documentation - mediawiki 在线所见即所得编辑器或预览工具

css - VS Code CSS 配置预览不适用于 Markdown 工作区设置

javascript - 使用 Socket.io 无需重新加载即可刷新页面上的数据

javascript - 找到 Javascript 数组的总和并除以它的长度

javascript - JS Menu 保持菜单状态

java - 如果使用正则表达式连续出现超过 1 个,如何从字符串中删除一个单词

go - 雨果博客文章标题中的 Markdown 支持?