我希望匹配粗体降价。以下是一些示例:
qwer *asdf* zxcv
匹配*asdf*
qwer*asdf*zxcv
比赛*asdf*
qwer *asdf* zxcv
不匹配
*qwer* asdf zxcv
匹配*qwer*
像这样负面的背后看(?<!\)*(.*)*
行得通。
除了Firefox中没有浏览器支持,所以我无法使用它。
同样,我可以非常接近(^|[^\])*(.*)*
问题是有两个捕获组,我需要第二个捕获组的索引,而 Javascript 只返回第一个捕获组的索引。在这种情况下,我可以通过添加 1 来创可贴它,但在其他情况下,这个黑客将不起作用。
我这样做的原因是我试图用 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
表达式。
这应该可以解决问题:
/(?:^|[^\])(*[^*]+[^\]*)/
唯一的捕获组是用 * 括起来的字符串。