我正在寻找匹配粗体 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 组件并与其他纯文本片段一起存储在数组中,那么您可以使用 split
和map
:
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/