十分鐘學會正則表達式

PHP Java Python 算法 潘旭網 2019-04-04
十分鐘學會正則表達式

正則表達式用處挺廣的,主要用於處理字符串。

正則引擎

想要在計算機語言中使用正則表達式,那麼這門計算機語言必須要利用正則引擎去實現相應的正則庫。主要的正則引擎分為以下兩類:

  • DFA 確定性的狀態機。不使用”回溯”,效率高,但是支持的正則表達式語法有限。
  • NFA 非確定性狀態機。構造簡單,使用”回溯算法”,支持大多數的正則語法,是目前使用最廣泛的正則引擎,大多數計算機語言例如Java、PHP、Ruby、Python等都是使用的NFA正則引擎。

語言實現

不同的語言對正則的實現不同,暴露出來的方法也不同,但方法的作用其實都是大同小異,這裡用PHP語言做例子。

匹配字符串

  • preg_match(string $pattern, string $subject[, array &$matches]) 使用很頻繁。函數返回匹配到的結果的次數。只匹配一次,參數matches只返回第一條結果。
  • preg_match_all(string $pattern, string $subject[, array &$matches]) 使用很頻繁。函數返回匹配到的結果的次數。參數matches只返回所有結果。

替換字符串或數組

  • preg_replace($pattern, $replacement, $subject) 返回匹配過濾後的字符串或者數組。
  • preg_filter($pattern, $replacement, $subject)返回匹配過濾後的字符串或者數組。

這倆函數,都可以替換字符串,在字符串替換中,倆函數用法完全一致。

這倆函數,不僅可以替換字符串,還可以替換數組!在替換數組的時候,pre_filter會過濾掉沒有匹配到的內容,而pre_replace不會,這就是他倆的唯一區別。

替換數組

  • preg_grep(string $pattern, array $input[, int flags = 0]) 返回匹配模式的數組條目。閹割版本的preg_filter

正則運算符轉義

對一個字符串中的正則表達式的運算符:”. \ + * ? [ ] ^ $ ( ) { } = ! < > | : -“進行轉義,轉義成非正則表達式的運算符,否則正則表達式會認為其為運算符。

  • preg_quote(string $str[, string $delimiter = null ]) 轉義正則表達式字符串。返回轉義後的字符串。

正則表達式語法

你可以把正則表達式當做一門簡單的語言來看,但是它的語法顯然比一般的計算機語言要簡單一些。

界定符

指定正則表達式的開始和結束,可以當成是計算機語言中的大括號{和}。一般有三種表現方式:

  • 斜槓。例如/[0-9]/。這是最常用的方式,在PHP中,推薦使用這種方式。
  • 井號。例如#[0-9]。
  • 大括號。例如{[0-9]}。在正則表達式中,大括號還有其他作用,所以這種方式不推薦使用。

原子

正則表達式中最小的匹配單位,其實就是字符串中的字符。主要分為兩大類:

可見原子:

肉眼能夠看見的字符。

  • 標點符號。例如:”_ ? . ;,“等等
  • 英文字母數字。例如:”a-z,A-Z,0-9“
  • 漢字、日文、阿拉伯文等其他語言文字
  • 數理化公式符號。例如:”∩ ∪ π Ω “等等
  • 其他可見字符

由於某些字符在正則表達式中屬於特殊字符,那麼在書寫這類特殊字符的時候,應該注意要加上反斜槓\,例如如果匹配^直接寫/^/肯定不行,如果加上反斜槓,就可以了。\^

不可見原子:

肉眼看不到的。

  • 空格。
  • 換行符\n
  • 回車符\r
  • 製表符\t。其實就是按一下鍵盤tab鍵出來的
  • 其他不可見字符

元字符

定義原子的篩選方式,隊員原子進行歸類,簡化正則表達式的書寫。

  • | 匹配兩個或者多個分支選擇。 和計算機語言中的含義是一樣的:或者
  • [] 匹配方括號中的任意一個原子。
  • [^] 配配除方括號之外的任意字符串。
  • . 匹配除\n之外的任何單個字符。要匹配包括\n在內的任何字符,請使用象[.\n]的模式。
  • \d 十進制數字,等同於[0-9]
  • \D 匹配任意一個非十進制的數字,等同於[^0-9]
  • \s 匹配任意一個不可見原子。等同於[\f\n\r\t\v]
  • \S 匹配一個可見原子。等同於[^\f\n\r\t\v]
  • \w 匹配任意數字、字母或下劃線。既[0-9a-zA-Z_]
  • \W 匹配任意非數字、字母或下劃線。即[^0-9a-zA-Z_]

量詞

表示某一個原子連續出現的數量。

  • {n} 表示前面的原子恰好出現n次
  • {n,} 表示前面的原子最少出現n次
  • {n,m} 表示前面的原子最少出現n此,最多出現m次
  • * 匹配0次、1次、或者多次。等同於{0,}
  • + 一次或者多次。等同於{1,}
  • ? 0次數或者1次。等同於{0,1}

邊界控制

  • ^ 匹配字符串開始的位置。即”必須以……為開頭”
  • $ 匹配字符串結束的位置。即”必須以……為結尾”

模式單元

將模式單元中的括號及其正則表達式當做是一個原子來看待。

  • () 匹配其中的整體為一個原子。

修正模式

給正則表達式的匹配過程添加一種匹配模式

  • U 加U是懶惰匹配,不加U是默認的貪婪匹配。
  • i 忽略英文字母大小寫。
  • x 忽略空白。(包括空格和按tab鍵輸出的製表符)
  • s 讓元字符.匹配包括換行符在內的所有字符。
  • e preg_replace()在替換字符串中對逆向引用作正常的替換。簡單的說,就是PHP會把replace的結果當做PHP代碼。(替換字符串要符合php的語法規範)
  • 例如:echo preg_replace('/(\d+),(\d+)/e', '$1+$2', '2,3');會輸出5。

書寫方式為:

$pattern = '/hello World/U'

$pattern = '/hello World/i'

$pattern = '/hello World/Ui'//可以任意組合

相關推薦

推薦中...