如果前面没有反斜杠,如何匹配粗体降价?
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 组件并与其他纯文本一起存储在数组中,则可以使用 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
);
由于 "delimiter" 中有两个捕获组用于 split
调用,一个具有前面的字符,第二个是单词本身,[=15 中的每三个项目=] 结果是要加粗的单词,因此 i%3
表达式。
我正在寻找匹配粗体降价。以下是一些示例:
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 组件并与其他纯文本一起存储在数组中,则可以使用 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
);
由于 "delimiter" 中有两个捕获组用于 split
调用,一个具有前面的字符,第二个是单词本身,[=15 中的每三个项目=] 结果是要加粗的单词,因此 i%3
表达式。