最簡人機交互-從文本中匹配出想要的

瀏覽器 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);

當然,符合條件有肯定也有否定,如等於優秀=優秀,不等於優秀!=優秀,肯定的稱爲正向,否定的稱爲負向。又有了正向回顧斷言,負向回顧斷言,正向先行斷言,負向先行斷言的概念。

應用

在查詢功能中,經常會有批量查詢某些記錄的需求,如查詢多個學號的信息,通常會要求在查詢條件中,每行一個的輸入學號,還不允許有多餘的包括空格的其它符號,這樣效率很低。而使用正則表達式提取,則可以允許用戶任意複製文件作爲查詢條件,只要那些符合學號特徵的包含在裏邊就可以完成工作。

其它

正則表達式表達能力超強,值得花點時間學會基礎的表達,想想一個個從大量文本中去複製出來有多痛苦,批量匹配出來有多爽。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章