瀏覽器 F12 控制檯(Console),觸手可及的人機交互,JavaScript 命令行,輕量級,隨時輕鬆編程實踐。
接到任務,給一批手機號發送一則通知,你以爲會給你:
19000000003
19000000004
19000000005
實際給你的是這樣的:
本次活動相關人員:張三,男,19000000003,1980年出生;李四,男,19000000004;王五,女,19000000005,優秀員工......
我們會如何表達想要的?
"小劉,把文本中的手機號找出來。",然後就真的都找出來了,整整齊齊。
分析一下這個表達過程
(1)一種表達方式:手機號,小劉能識別手機號。
(2)一種輸入方式:一句"小劉",小劉便會豎起耳朵接收,點頭示意明白。
如何向計算機表達?
同樣的找到以上兩點就可以表達了。
(1)一種表達方式:正則表達式。
(2)一種輸入方式:控制檯指令。
兩點 | 人類 | 計算機 |
---|---|---|
一種表達方式 | 手機號 | 正則表達式 |
一種輸入方式 | 耳朵 | 控制檯指令 |
正則表達式
計算機語言文法、狀態機這些計算理論爲人類表達文本的模式提供了強大的支持。正則表達式,也就是規則表達式,你描述規則,我爲你匹配。因此,只要學會如何描述想要的文本的規則,剩下的就可以交給計算機了。
來看幾個簡單的表達:
\d :表示一個數字
\d? : 表示零個或一個數字
\d+ : 表示一至多個數字
\d* : 表示零至多個數字
\d{11}:表示 11 個數字
1\d{10}:表示 1 後邊再 10 個數字
輸入方式
在控制檯,使用"/正則表達式/"形式表達正則表達式,使用 match 來獲取匹配。
來看看完成這個示例中手機號提取的指令,我們選擇簡單一點的正則表達式\d{11}
。
var t = "本次活動相關人員:張三,男,19000000003,1980年出生;李四,男,19000000004;王五,女,19000000005,優秀員工......";
var r = t.match(/\d{11}/g);
console.log(r)
至於更精準的表達,更多的表達方式,可以在需要時去搜索參考資料。
正多表達式還提供更多情形的表達能力,如本例中,如果是以下情形也是可以的:
(1)只需列出男的手機號
首先尋找特徵並描述:手機號前邊是"男,"的符合。這種要匹配的內容在指定條件的後邊的稱爲回顧斷言,表示匹配到一個結果,要回顧一下之前的是否符合條件。使用 "(?<=條件)",則可表達爲:
t.match(/(?<=男,)\d{11}/g);
(2)列出優秀的手機號
同樣尋找特徵並描述:手機號後邊是",優秀"的符合。這種要匹配的內容在指定條件的前邊的稱爲先行斷言,表示匹配到一個結果,要往前瞅瞅看是否符合條件。使用 "(?=條件)",則可表達爲:
t.match(/\d{11}(?=,優秀)/g);
當然,符合條件有肯定也有否定,如等於優秀=優秀
,不等於優秀!=優秀
,肯定的稱爲正向,否定的稱爲負向。又有了正向回顧斷言,負向回顧斷言,正向先行斷言,負向先行斷言的概念。
應用
在查詢功能中,經常會有批量查詢某些記錄的需求,如查詢多個學號的信息,通常會要求在查詢條件中,每行一個的輸入學號,還不允許有多餘的包括空格的其它符號,這樣效率很低。而使用正則表達式提取,則可以允許用戶任意複製文件作爲查詢條件,只要那些符合學號特徵的包含在裏邊就可以完成工作。
其它
正則表達式表達能力超強,值得花點時間學會基礎的表達,想想一個個從大量文本中去複製出來有多痛苦,批量匹配出來有多爽。