如果前面没有反斜杠,如何匹配粗体降价?

How to match bold markdown if it isn't preceded with a backslash?

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

qwer *asdf* zxcv 匹配 *asdf*

qwer*asdf*zxcv 匹配 *asdf*

qwer \*asdf* zxcv不匹配

*qwer* asdf zxcv 匹配 *qwer*

像这样消极地看待背后 (?<!\)\*(.*)\* 有效。

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

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

问题是有两个捕获组,我需要第二个捕获组的索引,Javascript只returns第一个捕获组的索引。在这种情况下,我只需加 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, "<strong></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
);

由于 "delimiter" 中有两个捕获组用于 split 调用,一个具有前面的字符,第二个是单词本身,[=15 中的每三个项目=] 结果是要加粗的单词,因此 i%3 表达式。