1. 程式人生 > >架構思維案例:速學正則

架構思維案例:速學正則

前言

本文的目的不僅是教會讀者怎麼使用正則表示式。更希望通過學習正則表示式的案例,讓讀者感受一種不同的思維方式。魚亦漁亦水,誰知道呢,我在扯淡,你要不要看?

正文

正則表示式是描述一組字串特徵的模式,用來匹配特定的字串。--Ken Thompson

這句話中提到了兩點:

  1. 正則表示式是描述一組字串特徵的模式;
  2. 正則表示式是用來匹配特定的字串的。

匹配特定字串就是正則表示式要解決的問題域。
怎麼解決的呢?通過描述一組字串特徵的方式來匹配。

舉個例子:

www.ly.com

我們通常是這樣去描述的:3w.ly.com
這裡我們把連續的多個w,用位數簡述了(對應位區間的概念,後面會詳細講解)。這就是正則表示式解決問題的思路。

正則表示式:

w{3}.ly.com

再比如,怎麼描述一個正整數呢?
首位是1-9的數字,其餘位為0到9。其餘位位數是0到無窮。
這裡我們把首位字元的可能性羅列了出來。把其餘位位數用一個可能性區間描述。

正則表示式:

[1-9][0-9]{0,}

至此,我們感性認識了正則表示式。下面將正式帶領大家認識這個“描述字串特徵的模式”。

什麼是字串呢?一串字元唄。本著化繁為簡的常規架構手法(分而治之),可以想到描述一組字串特徵的問題,可以拆解為:

  1. 描述一個字元特徵的問題;
  2. 描述一個字元位區間的問題。

比如,上面正整數的例子[1-9]描述了字元特徵,{0,}描述了0到無窮的一個位區間。

這裡我們需要宣告或重申幾個概念:

  • 正則表示式:描述一組字串特徵的模式
  • 值特徵:描述一個字元特徵(可能性)的模式
  • 位區間:描述一個字元位區間的模式

一、值特徵符

我們使用[ ]表示。如下:
[Aa]:描述一個字元可能是A或a中的一個。

  1. 簡寫法
    • A=[A]
      當描述的字元取值只有一種可能時,我們通常用字面量A代替。

    • [1-5]=[1,2,3,4,5]
      當描述的字元取值的可能性是連續時,我們通常用-簡寫。

  1. 邏輯符號

    • |
      邏輯“或”

    • ^
      邏輯“取反”

  2. 抽象

    • 數字
    \d=[0123456789]
    • 字母或數字或下劃線
    \w=[A-Za-z0-9_]
    • 空白字元
    \s=[ \f\n\r\t\v]
    • 大寫字母是小寫字元表徵值的取反
    \D=^\d
    \W=^\w
    \S=^\s
    • 任意字元
    .

    正則中的object

二、位區間符

我們使用{}標識。如下:

{3,5}:描述35位。
{2,}:描述2到無窮位。
{0,3}:描述03位。

簡寫

  • {3}={3,3}
  • *={0,}
  • +={1,}
  • ?={0,1}

三、邊界符

邊界符不描述字元,而是描述字串中的位置。

  • 行首:^
  • 行尾:$
  • 單詞邊界:\b

四、分組符

分組符是解決另一個問題。在我們選擇出某個字串後,我們在替換結果裡使用其中的一部分(子模式)。
我們把這種,先選擇後使用的過程叫做後引用。
其中分組符,就是用來解決子模式切割的。

  • 捕獲分組:()
  • 非捕獲分組:(?:)

替換時,$0:是匹配的整個字串。
$1:是捕獲的第一個子模式(從前到後遇到的第一個捕獲分組起始符)
依次類推,$n:是捕獲的第n個子模式。

下面給三個例子:
例1:

例2:

例3:

五、轉義符

\

怎麼描述被正則表示式佔用的關鍵字元呢?
轉義。

例如:\.描述.

 關注公眾號“架構思維修煉”,輸入關鍵字“正則表示式圖解”,獲取高清腦圖。

相關推薦

架構思維案例

前言 本文的目的不僅是教會讀者怎麼使用正則表示式。更希望通過學習正則表示式的案例,讓讀者感受一種不同的思維方式。魚亦漁亦水,誰知道呢,我在扯淡,你要不要看? 正文 正則表示式是描述一組字串特徵的模式,用來匹配特定的字串。--Ken Thompson 這句話中提到了兩點: 正則表示式是描述一組

大叔ML第四線性迴歸

目錄 基本形式 梯度下降法中應用正則化項 正規方程中應用正則化項 小試牛刀 呼叫類庫 擴充套件 正則:正則是一個漢語詞彙,拼音為zhèng zé,基本意思是正其禮儀法則;正規;常規;正宗等。出自《楚辭·離騷》、《插圖本中國文學史》、《東京賦》等文獻。 —— 百度百科

iOS詳細的表達式

bject for one 常用 一個 .cn 想要 bbb 公式 1、簡介: 在項目中,正則的使用是很普遍的,例如登錄賬號和密碼(手機號、郵箱等)。用到的方法就是謂詞對象過濾:NSPredicate。 2、什麽是正則表達式:   正則表達式,又稱正規表示法,是

HTML5前端入門教程簡析表達式

分開 mail 出現 字符串匹配 很多 字符串操作 一個 來看 條件 很多人對正則表達式的印象都是用來做表單驗證的,這其實是不大準確的。正則表達式目前在很多軟件中都得到了廣泛的應用,包括Linux,Unix等操作系統,VB,Java,PHP等開發環境中,以及很多應用軟件都能

轉載常見的表達式

控件 轉換 ret rip 提取 用戶 htm RR oar 匹配中文:[\u4e00-\u9fa5] 英文字母:[a-zA-Z]數字:[0-9]匹配中文,英文字母和數字及_:^[\u4e00-\u9fa5_a-zA-Z0-9]+$同時判斷輸入長度:[\u4e00-\u9f

Python學習13.Python表達式

tro 引擎 表達式 ups esx 位置 大小 split nco 一、正則表達式簡介   正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。 Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。   就其

專案小結手機郵箱,URL各種判斷返回頁面,input輸入框輸入符合卻獲取不到問題

1.手機郵箱正則 近兩年出來很多新號碼,聽說199什麼的都有了- -導致以前的正則不能用了....這就很難過,總是過一段時間出一種新號碼。因此,我決定使用返樸歸真的手機正則。 手機正則:var reg=/^1[0-9]\d{9}$/; 郵箱正則:var mailReg = /^[a-zA-Z0-9_.-

week4函式之表示式

一、正則表示式 string提供的方法是完全匹配 引入正則表示式是模糊匹配,內嵌在python中,通過呼叫Re模組來實現 二、字元匹配(普通字元,元字元): 普通字元:大多數字符和字母都會和自身匹配 re.findall('alex','yuanalesalexduye') ##

以Grep表示式 學習筆記

基本格式 grep -n -A2 -B3 --color=auto 'the' ./ 搜尋特定字串 grep -n 'the' //含 grep -vn 'the' //不含 grep -in 'the' //含大小寫 利用中括號 [] 來搜尋集合字元 grep -n

jmeter教程(八)關聯及表示式提取器

所謂關聯,就在從前面請求的響應中提取資料,給後面的請求使用。而提取資料,則需要用到後置處理器裡的正則表示式提取器。為了演示,我簡單寫了一個java請求,模擬介面的響應資料 響應的資料為一個json,這是模擬介面查詢會員列表的資料。time是查詢資料花費的時間,count是查詢出了多少條資料

效能比較lxml庫,表示式,BeautifulSoup ,用資料證明lxml解析器速度快

Beautiful Soup支援的解析器 解析器 使用方法 優勢 劣勢 Python標準庫 BeautifulSoup(markup, "html.parse

Python表示式如何使用表示式

正則表示式(簡稱RE)本質上可以看作一個小的、高度專業化的程式語言,在Python中可以通過re模組使用它。使用正則表示式,你需要為想要匹配的字串集合指定一套規則,字串集合可以包含英文句子、e-mail地址、TeX命令或者其它任何你希望的字串。然後您能提這樣的問題:“這個字

iOS使用NSRegularExpression去掉一串字串中所有的特殊字元和標點

/* 遍歷的模式,正則表示式匹配在指定options和range模式下匹配指定string,傳入block中可以獲取結果資訊 */ - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options

非貪婪匹配如何使用表示式碰到到第一個匹配到的字串就停止

? 當該字元緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串“oooo”,“o+”將盡可能多的匹配“o”,得到結果[

神經網路九Regularization(化)與Dropout

本文主要講解神經網路中的正則化(Regularization)和Dropout,都是用了減小過擬合。正則化在機器學習領域中很重要。主要針對模型過擬合問題而提出來的。本文是觀看麥子學院的視訊整理而來。下

專案經驗js 結合表示式判斷是否為電話號碼或者手機號碼

function Phone(obj){ var regBox = { regEmail : /^([a-z0 -9_\. -]+)@([\da -z\. -]+)\.([a -z\.]{2,6})$/, //郵箱

備忘關於php匹配不成功的問題

某php程式的正則部分突然不能正常工作,除錯發現正則匹配失敗 仔細檢查後發現正則表示式無誤,但preg_match始終返回false。 翻手冊的時候看到了preg_last_error()函式,新增後發現返回值為PREG_BACKTRACK_LIMIT_ERROR 搜尋一番

shell文字過濾程式設計(一)grep和表示式

Linux系統中有很多檔案,比如配置檔案、日誌檔案、使用者檔案等。檔案中都包含了大量的資訊,我們可以使用cat等命令輕鬆將其輸出到螢幕,但如果要從檔案中分析或提取資料,還需要其他工具來實現。而linux正好提供了這些工具:grep、awk、sed等。把這些工具使用好,可以

ES6學習筆記字串、、數值、函式和陣列的擴充套件

字串的擴充套件 includes():返回布林值,表示是否找到了引數字串。 startsWith():返回布林值,表示引數字串是否在原字串的頭部。 endsWith():返回布林值,表示引數字串是否在原字串的尾部。 let s = 'Hello wo