學習正則表達式的最好方法是從例子開始,理解例子之后再自己對例子進行修改,實驗。我覺得正則表達式很像大一時候學習的離散數學的,使用“與或非(&,|,^)”的邏輯表達式來抽象一段復雜的自然語言描述,從而解決一些邏輯分析問題。
1.語法:
2.實例
當我們進入大學的時候,每個同學都會有一個學號(例如我的學號是201235010126)。在我們的大學,學號里面集中了年級,專業代碼,班級代碼,學生編號的種種信息,由此得到每一個同學唯一的ID號。今天這里采用專業年級的例子,由淺入深,講解一個復雜表達式的來源。下面結合自己情況,以所在大學湖南大學保密專業為例,寫一寫學習正則表達式心得。
學號編碼規則:
對201235010126來說:
條件1:1-4位(2012)表示年號
條件2:5-8位(3501)固定是專業號3501
條件3:倒數第三位表示班級號,每個年紀有6個班級
條件4:最后兩位表示班級內學號,每個班有32人
條件5:12級開始倒數第四位補0
2.1實例一:匹配12級保密1班的學生。
正則表達式是:
/^2012350101(?:0[1-9]|[1-2]\d|3[0-2])$/
分析
1."^"匹配開頭,"$"匹配結尾,"|"表示或
2.?:匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用.
3.學生學號是01-32,所以拆分成3組:
a)01-09:0[1-9]
b)10-29:[1-2]/d
c)30-32:3[0-2]
2.2實例二:匹配11級保密和12級保密班的全體學生。
/^201(?:13501|235010)1(?:0[1-9]|[1-2]\d|3[0-2])$/
?:是小括號的專利,因為小括號里面的是一組字符
2.3實例三:匹配11級保密6個班和12級保密6個班的所有學生
/^201(?:13501|235010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
()表示把一些代碼組合起來,[]表示把所有的字符組合起來
2.4實例四:匹配2001-2019級的所有學生(假設每個年級6個班,其中2011為分界線,2012級開始倒數第四位補0)
/^20(?:(?:0[1-9]|1[0-1])3501|1[2-9]35010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
分析##
1.條件1-2規定了最后三位,也就是101-632,所以我們可以輕松想到1-6$這樣可以匹配后三位,在這里面01 - 32可以分成3段:
a)01-09:0[1-9]
b)10-29:[1-2]/d
c)30-32:3[0-2]
2.然后我們看前面四位,由於特殊的年份是以11-12年分界的,所以我們說從第3位到倒數第4位都是特殊的,開頭肯定是^20,然后里面根據情況可以分為補0的還是不補為的,所以可以得到(xxx3501|xxx35010),然后我們可以看到第一個XXX表示的是01-11,也即可以寫成(?:0[1-9]|1[01]),第二個表示的是12-19,也即可以直接寫成1[2-9],所以中間一部分是
(?:(?:0[1-9]|1[01])3501|1[2-9]35010)
3.最后:我們就可以得出一個看起來非常高大上的正則表達式了
/^20(?:(?:0[1-9]|1[0-1])3501|1[2-9]35010)[1-6](?:0[1-9]|[1-2]\d|3[0-2])$/
終於把這個看似高大上的一串正則表達式匹配出來了,其實只要仔細羅列好條件,正則表達式就是xx的oo次的無限組合。O(∩_∩)O~ ~