架構思惟案例:速學正則

 

前言

本文的目的不只是教會讀者怎麼使用正則表達式。更但願經過學習正則表達式的案例,讓讀者感覺一種不一樣的思惟方式。魚亦漁亦水,誰知道呢,我在扯淡,你要不要看?正則表達式

正文

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

這句話中提到了兩點:學習

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

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

舉個例子:code

www.ly.com

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

正則表達式:字符串

w{3}.ly.com

再好比,怎麼描述一個正整數呢?
首位是1-9的數字,其他位爲0到9。其他位位數是0到無窮。
這裏咱們把首位字符的可能性羅列了出來。把其他位位數用一個可能性區間描述。string

正則表達式:class

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

至此,咱們感性認識了正則表達式。下面將正式帶領你們認識這個「描述字符串特徵的模式」。object

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

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

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

這裏咱們須要聲明或重申幾個概念:

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

1、值特徵符

咱們使用[ ]表示。以下:
[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

2、位區間符

咱們使用{}標識。以下:

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

簡寫

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

3、邊界符

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

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

4、分組符

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

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

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

下面給三個例子:
例1:

例2:

例3:

5、轉義符

\

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

例如:\.描述.

 

 

 


 關注公衆號「架構思惟修煉」,輸入關鍵字「正則表達式圖解」,獲取高清腦圖。

相關文章
相關標籤/搜索