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



我希望匹配粗体降价。以下是一些示例:

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 组件并与其他纯文本片段一起存储在数组中,那么您可以使用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表达式。

这应该可以解决问题:

/(?:^|[^\])(*[^*]+[^\]*)/

唯一的捕获组是用 * 括起来的字符串。

最新更新