看懂火星文(一)

感謝
本文參考《正則表示式迷你書》

模糊匹配
橫向模糊匹配
什麼是橫向模糊匹配?
正則可匹配的字串的長度不是固定的。例如**/ab{2, 5}c/**, 含義一個a接下來2到5個b接下來是c。

縱向模糊匹配
什麼是縱向模糊匹配?
正則匹配到字串到某一個的字元時,可以不是某個確定的字元,可以有多種可能。例如**/a[123]b/**, 匹配的字串可以是a1b, a2b, a3b

字串組
雖叫字元組, 但是正則只是匹配字元組中的一個字元
範圍表示法
[123456abcGHIJ] // 可以寫成 [1-6a-cG-J] 複製程式碼
排除字元組
// 就是字串中某一位不能為abc [^abc] 複製程式碼
常見的簡寫形式
簡寫 | 原始 |
---|---|
\d | [0-9] |
\D | [^0-9] |
\w | [0-9a-zA-Z] |
\W | [^0-9a-zA-Z] |
\s | [\t\v\n\r\f] 空白, 水平製表, 垂直製表, 換行, 回車, 換頁 |
\S | [^\t\v\n\r\f] |
. | 萬用字元 |
如何匹配任意字元 ?
[\d\D], [\w\W], [\s\S], [^]
量詞
量詞簡寫
量詞 | 含義 |
---|---|
{m, } | 至少出現m次 |
{m} | 出現m次 |
? | {0, 1} |
+ | {1, } |
* | {0, } |

貪婪匹配和惰性匹配
什麼是貪婪匹配
是儘可能多的匹配
// reg會盡可能多的匹配, 例如: 12345, 我會匹配12345而不匹配12 var reg = /\d{2, 5}/g; 複製程式碼
什麼是惰性匹配
是儘可能少的匹配
// reg會盡可能少的匹配, 例如: 12345, 我會匹配 12, 34 // 只要滿足2個, 就不會往下匹配了 var reg = /\d{2, 5}?/g 複製程式碼
貪婪量詞, 惰性量詞
惰性量詞一般是在貪婪量詞後面新增問號
貪婪量詞 | 惰性量詞 |
---|---|
{m, n} | {m, n}? |
{m, } | {m, }? |
? | ?? |
+ | +? |
* | *? |

多選分支
什麼是多選分支
多選分支可以支援多個子正則任選其一。注意分支匹配也是惰性的, 當匹配滿足第一個後就不會第二個了。
// 可以匹配good或者nice var reg = /good|nice/ 複製程式碼

案例
匹配16禁止顏色值
分析
- 以“#”開頭, #字後面可能出現[0-9a-fA-F]的字元, 3次或者6次
實現
var reg = /^#{1}[0-9a-fA-F]{3}$|^#{1}[0-9a-fA-F]{6}$/g 複製程式碼

匹配時間
分析
- 當時間的第一位以0或者1開頭的時候, 第二位可以是0到9數字
- 當時間的第一位以2開頭的時候, 第二位只能是0-3的數字
實現
// 匹配補0的時間格式(MM:SS) var reg1 = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/g // 匹配不需要補0的時間格式(M:S|MM:SS), 個位數開始0可以不寫 var reg2 = /^(0?[0-9]|[1][0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/g 複製程式碼

:date: 匹配日期
分析
- 匹配年份的時候, 年份由0到9的數字組成的4位陣列成
- 匹配月份的時候, 月份以0作為第一位數字的時候第二位可以是1到9的任意數字, 月份以1作為第一位數字的時候第二位可以是1到2的任意數字
- 匹配日期的時候, 日期最大31天
實現
var reg = /^([0-9]{4})-(0[1-9]|1[1-2])-(0[1-9]|[12][0-9]|3[01])$/g 複製程式碼

:page_with_curl: 匹配window的檔案路徑
路徑的常見格式如下:
F:\study\javascript\regex\regular expression.pdf
F:\study\javascript\regex\
F:\study\javascript
分析
- 首先匹配判符F:, 可以使用正則[a-zA-Z]:\
- 實現排除字元組[^\:*<>|"?\r\n/], 所有匹配排除字元組的都是非法字串
- 檔名不能為空字串[^\:*<>|"?\r\n/]+, 所以新增量詞+
- 檔案的路徑可以很長所以新增量詞*, ([^\: <>|"?\r\n/]+\)
- 檔案的路徑不以""結尾, 所以我們新增一個匹配路徑結尾的正則 ([^\:*<>|"?\r\n/]+)?
實現
var reg = /^[a-zA-Z]:\\([^\\:*<>|"?\r\n/]+\\)*([^\\:*<>|"?\r\n/]+)?$/g 複製程式碼

:computer: 匹配HTML中id屬性
分析
<div id="app" class="app"></div> var reg = /id=".*"/ 複製程式碼
如果使用此正則, 由於 是貪婪的, 並且.是萬用字元包含了", 所以 會匹配到最後一個"之前的所用內容(包括其他的")。我們可以使用惰性匹配模式(在量詞後面新增問號)
實現
// .*後遇到第一個"就會停止匹配 var reg1 = /id=".*?"/g 複製程式碼