簡體   English   中英

如果前面沒有反斜杠,如何匹配粗體降價?

[英]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只返回第一個捕獲組的索引。 在這種情況下,我可以通過添加 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 組件並與其他純文本一起存儲在數組中,那么您可以使用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表達。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM