正則表達(dá)式是一種通用的對字符串操作的邏輯公式绘趋,用事先規(guī)定好的一些特定的字符以及特定字符間的組合來組成一個規(guī)則字符串见妒,用來表示對字符串的過濾邏輯蔬顾。簡言之露氮,正則表達(dá)式是非常強(qiáng)大的文本處理工具踪古,僅僅使用非常簡潔的表達(dá)式語句含长,便能迅速的實現(xiàn)非常復(fù)雜的業(yè)務(wù)邏輯券腔,極大的提高開發(fā)效率和程序的運行效率。
文章起源
本篇文章緣起為我個人的畢業(yè)設(shè)計項目《一個多平臺 Blog 系統(tǒng)的開發(fā)與實現(xiàn)》拘泞,既然是做一個 Blog 收發(fā)平臺纷纫,除了基本的文章撰寫、發(fā)布陪腌、評論辱魁、點贊、收藏诗鸭、分享功能之外染簇,更為重要的是需要支持 Markdown 語法排版和解析的功能,很難想象一個號稱 Blog 的平臺不支持富文本排版會是一個什么樣的體驗强岸。
Markdown 是一種可以使用普通文本編輯器編寫的標(biāo)記語言锻弓,通過簡單的標(biāo)記語法,它可以使普通文本內(nèi)容具有一定的格式蝌箍。既然如此弥咪,那解析 Markdown 語法文本字符串的功能的實現(xiàn)自然而然的就想到了使用正則表達(dá)式。
正則表達(dá)式規(guī)則
在使用正則表達(dá)式解析 Markdown 語法之前十绑,我們要先對正則表達(dá)式的規(guī)則有一個基本的認(rèn)識聚至,下面我整理了一張正則表達(dá)式語法對照表。
正則字符 | 含義 | 正則字符 | 含義 |
---|---|---|---|
^ | 以某指定字符開頭 | (a|b) | a 或 b |
$ | 以某指定字符結(jié)尾 | [abc] | 匹配一個單字符是 a 或 b 或 c |
. | 匹配任意單字符 | [^abc] | 匹配一個單字符不是 a 或 b 或 c |
* | 匹配前面的子表達(dá)式0次或多次 | [a-z] | 小寫字符 a ~ z 之間 |
\ | 轉(zhuǎn)義字符 | [0-9] | 數(shù)字 0 ~ 9 之間 |
[] | 使用[]中的規(guī)則集合匹配對象 | \s | 空格 |
() | 標(biāo)記一個子表達(dá)式的開始和結(jié)束位置 | \S | 非空格 |
+ | 匹配前面的子表達(dá)式1次或多次 | \d | 數(shù)字 |
| | 或者 | \D | 非數(shù)字 |
? | 匹配前面的子表達(dá)式0次或1次 | {x} | x是非負(fù)整數(shù)本橙,匹配確定的 x 次 |
- | 指定字符串的范圍 | {x,} | x是非負(fù)整數(shù)扳躬,匹配至少 x 次 |
\b | 匹配一個單詞邊界,即單詞和空格間的位置 | {x,y} | xy是非負(fù)整數(shù)甚亭,匹配 x~y 次之間 |
正則表達(dá)式簡單應(yīng)用
1贷币、表示所有以"The"開始的字符串。("There", "The cat")
^The
2亏狰、表示字符串包含一個a役纹,并且 a 后面跟著0個或多b。("a", "ab", "abbb")
ab*
3暇唾、表示字符串有一個a促脉,并且 a 后面跟著至少2個b。
ab{2,}
4策州、表示字符串有一個a瘸味,并且 a 后面跟著一個任意字符和一個數(shù)字。
a.[0-9]
除此之外够挂,網(wǎng)上還有很多有關(guān) URL旁仿、Email、電話或手機(jī)號碼孽糖、校驗郵政編碼枯冈、校驗密碼強(qiáng)度等規(guī)則毅贮,這里就不在一一列舉說明了。
正則表達(dá)式解析 Markdown 語法
Markdown 語法包括標(biāo)題尘奏、圖片滩褥、鏈接、引用塊罪既、列表、粗體铡恕、斜體等琢感,下面是解析這些語法的正則表達(dá)式和簡單說明:
1、標(biāo)題(表示以一個或多個“#”開頭的字符串探熔,并且“#”之后有0個或以上的字符驹针,如:“### 三級標(biāo)題”)。
^(#+)(.*)
2诀艰、鏈接 (在 Markdown 語法中鏈接的表示形式為 [鏈接](URL)柬甥。)。
(\\[.+\\]\\([^\\)]+\\))|(<.+>)
上面的表達(dá)式可以以 | 分為兩個部分:
a) (\[.+\]\([^\)]+\))
b) (<.+>)
其中 b) 匹配的是 HTML 標(biāo)簽對其垄,而 a) 又可以以中間的 \ 分為兩個部分:
c) \[.+\]
d) ([^\)]+\)
其中 c) 是用來匹配包含 [ + 超過1個字符 + ] 的字符串苛蒲,而 d) 是用來匹配緊隨其后的包含 ( + 超過1個字符 + )的字符串。滿足這個整體規(guī)則的字符串便是 Markdown 語法的鏈接了绿满。
3臂外、斜體(表示以一個 * 或者 _ 開頭并結(jié)尾(\\1表示規(guī)則和第一個集合相同),中間包含0個或多個字符的字符串)喇颁。
(\\*|_)(.*?)\\1
懶癌發(fā)作漏健,一個一個的這么分析太慢了,如果你們需要橘霎,請自行結(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è)計里面榜跌,最大的用途之一是 Markdown 語法的實時高亮和富文本轉(zhuǎn)換。先看看效果圖碧库,改天寫關(guān)于 Markdown 語法高亮和富文本轉(zhuǎn)換的應(yīng)用柜与。
總結(jié)
本文旨在通過介紹一些正則表達(dá)式的基礎(chǔ)語法巧勤,并根據(jù)在自己實際的畢業(yè)設(shè)計項目中的應(yīng)用來簡單解釋一些有關(guān)正則表達(dá)式的一些用法。另外弄匕,想要熟練掌握正則表達(dá)的規(guī)則只能通過自己多寫多練颅悉,這里給大家推薦一款不錯的在線正則表達(dá)式測試工具regex101。
有任何疑問或指正請前往我的個人主頁:崔鵬飛的個人主頁迁匠,或直接聯(lián)系:0x00ffee@gmail.com剩瓶,謝謝。