正則表達(dá)從入門到解析 Markdown 語法【Swift】

正則表達(dá)式是一種通用的對(duì)字符串操作的邏輯公式,用事先規(guī)定好的一些特定的字符以及特定字符間的組合來組成一個(gè)規(guī)則字符串,用來表示對(duì)字符串的過濾邏輯。簡言之,正則表達(dá)式是非常強(qiáng)大的文本處理工具,僅僅使用非常簡潔的表達(dá)式語句,便能迅速的實(shí)現(xiàn)非常復(fù)雜的業(yè)務(wù)邏輯,極大的提高開發(fā)效率和程序的運(yùn)行效率。

文章起源

本篇文章緣起為我個(gè)人的畢業(yè)設(shè)計(jì)項(xiàng)目《一個(gè)多平臺(tái) Blog 系統(tǒng)的開發(fā)與實(shí)現(xiàn)》,既然是做一個(gè) Blog 收發(fā)平臺(tái),除了基本的文章撰寫、發(fā)布、評(píng)論、點(diǎn)贊、收藏、分享功能之外,更為重要的是需要支持 Markdown 語法排版和解析的功能,很難想象一個(gè)號(hào)稱 Blog 的平臺(tái)不支持富文本排版會(huì)是一個(gè)什么樣的體驗(yàn)。

Markdown 是一種可以使用普通文本編輯器編寫的標(biāo)記語言,通過簡單的標(biāo)記語法,它可以使普通文本內(nèi)容具有一定的格式。既然如此,那解析 Markdown 語法文本字符串的功能的實(shí)現(xiàn)自然而然的就想到了使用正則表達(dá)式。

正則表達(dá)式規(guī)則

在使用正則表達(dá)式解析 Markdown 語法之前,我們要先對(duì)正則表達(dá)式的規(guī)則有一個(gè)基本的認(rèn)識(shí),下面我整理了一張正則表達(dá)式語法對(duì)照表。

正則字符 含義 正則字符 含義
^ 以某指定字符開頭 (a|b) a 或 b
$ 以某指定字符結(jié)尾 [abc] 匹配一個(gè)單字符是 a 或 b 或 c
. 匹配任意單字符 [^abc] 匹配一個(gè)單字符不是 a 或 b 或 c
* 匹配前面的子表達(dá)式0次或多次 [a-z] 小寫字符 a ~ z 之間
\ 轉(zhuǎn)義字符 [0-9] 數(shù)字 0 ~ 9 之間
[] 使用[]中的規(guī)則集合匹配對(duì)象 \s 空格
() 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置 \S 非空格
+ 匹配前面的子表達(dá)式1次或多次 \d 數(shù)字
| 或者 \D 非數(shù)字
? 匹配前面的子表達(dá)式0次或1次 {x} x是非負(fù)整數(shù),匹配確定的 x 次
- 指定字符串的范圍 {x,} x是非負(fù)整數(shù),匹配至少 x 次
\b 匹配一個(gè)單詞邊界,即單詞和空格間的位置 {x,y} xy是非負(fù)整數(shù),匹配 x~y 次之間

正則表達(dá)式簡單應(yīng)用

1、表示所有以"The"開始的字符串。("There", "The cat")

^The

2、表示字符串包含一個(gè)a,并且 a 后面跟著0個(gè)或多b。("a", "ab", "abbb")

ab*

3、表示字符串有一個(gè)a,并且 a 后面跟著至少2個(gè)b。

ab{2,}

4、表示字符串有一個(gè)a,并且 a 后面跟著一個(gè)任意字符和一個(gè)數(shù)字。

a.[0-9]

除此之外,網(wǎng)上還有很多有關(guān) URL、Email、電話或手機(jī)號(hào)碼、校驗(yàn)郵政編碼、校驗(yàn)密碼強(qiáng)度等規(guī)則,這里就不在一一列舉說明了。

正則表達(dá)式解析 Markdown 語法

Markdown 語法包括標(biāo)題、圖片、鏈接、引用塊、列表、粗體、斜體等,下面是解析這些語法的正則表達(dá)式和簡單說明:

1、標(biāo)題(表示以一個(gè)或多個(gè)“#”開頭的字符串,并且“#”之后有0個(gè)或以上的字符,如:“### 三級(jí)標(biāo)題”)。

^(#+)(.*)

2、鏈接 (在 Markdown 語法中鏈接的表示形式為 [鏈接](URL)。)。

(\\[.+\\]\\([^\\)]+\\))|(<.+>)

上面的表達(dá)式可以以 | 分為兩個(gè)部分:

a) (\[.+\]\([^\)]+\))

b) (<.+>)

其中 b) 匹配的是 HTML 標(biāo)簽對(duì),而 a) 又可以以中間的 \ 分為兩個(gè)部分:

c) \[.+\]

d) ([^\)]+\)

其中 c) 是用來匹配包含 [ + 超過1個(gè)字符 + ] 的字符串,而 d) 是用來匹配緊隨其后的包含 ( + 超過1個(gè)字符 + )的字符串。滿足這個(gè)整體規(guī)則的字符串便是 Markdown 語法的鏈接了。

3、斜體(表示以一個(gè) * 或者 _ 開頭并結(jié)尾(\\1表示規(guī)則和第一個(gè)集合相同),中間包含0個(gè)或多個(gè)字符的字符串)。

(\\*|_)(.*?)\\1

懶癌發(fā)作,一個(gè)一個(gè)的這么分析太慢了,如果你們需要,請(qǐng)自行結(jié)合 Markdown 語法規(guī)則分析下面的正則表達(dá)式:

4、圖片(部分地方同鏈接)

!\\[[^\\]]+\\]\\([^\\)]+\\)

5、粗體(同斜體)

(\\*\\*|__)(.*?)\\1

6、刪除線(刪除線

\\~\\~(.*?)\\~\\~

7、引用塊

\n(&gt;|\\>)(.*)

8、內(nèi)聯(lián)代碼塊

`{1,2}[^`](.*?)`{1,2}

9、分割線

^-+$

10、```包圍的代碼塊

```([\\s\\S]*?)```[\\s]?

11、無序列表

^[\\s]*[-\\*\\+] +(.*)

12、有序列表

^[\\s]*[0-9]+\\.(.*)

應(yīng)用

這些解析規(guī)則全都應(yīng)用在了我的畢業(yè)設(shè)計(jì)里面,最大的用途之一是 Markdown 語法的實(shí)時(shí)高亮和富文本轉(zhuǎn)換。先看看效果圖,改天寫關(guān)于 Markdown 語法高亮和富文本轉(zhuǎn)換的應(yīng)用。

正則表達(dá)解析 Markdown 語法應(yīng)用

總結(jié)

本文旨在通過介紹一些正則表達(dá)式的基礎(chǔ)語法,并根據(jù)在自己實(shí)際的畢業(yè)設(shè)計(jì)項(xiàng)目中的應(yīng)用來簡單解釋一些有關(guān)正則表達(dá)式的一些用法。另外,想要熟練掌握正則表達(dá)的規(guī)則只能通過自己多寫多練,這里給大家推薦一款不錯(cuò)的在線正則表達(dá)式測試工具regex101。

有任何疑問或指正請(qǐng)前往我的個(gè)人主頁:崔鵬飛的個(gè)人主頁,或直接聯(lián)系:0x00ffee@gmail.com,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容