正則表達(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(>|\\>)(.*)
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)用。

總結(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,謝謝。