簡述
正則表達式(regular expression):描述可能出現在用戶提交的文本中的一小段代碼,我們通過它,將出現的代碼塊替換爲特殊格式。
正則表達式廣泛好用,但入門困難。
語法規範
分隔符
目標代碼塊被分隔符包圍,分隔符一般選用斜槓(/)或井號(#),也可以用除字母、數字和反斜槓之外的任何字符作爲分隔符。反斜槓可以轉義,轉義在基礎級文章略有提及,此處不贅述。
模式修飾符
默認情況下,正則表達式區分大小寫,不過我們可以通過模式修飾符(pattern modified),使正則忽略大小寫。
模式修飾符是一個單個的字符標誌,跟在表達式的結束分隔符後。
符號 | 註釋 |
---|---|
i | 匹配時,不區分大小寫 |
特殊字符
符號- | 中文名—- | 註釋 |
---|---|---|
^ | 脫字字符 | 匹配字符串的開始,自身不包含任何字符,只考慮字符位置 |
$ | 美元符號 | 匹配字符串的結尾,同上 |
. | 點號 | 通配符,匹配任何單個字符,除了換行(\n) |
* | 星號 | 要求前面的字符出現0或多次,具有貪婪屬性1 |
+ | 加號 | 要求前面的字符出現1或多次,具有貪婪屬性 |
? | 問號 | 匹配前面的子表達式0次或1次,在* 或+ 的後面加上一個? 就可以實現非貪婪(最小匹配,minimal match) |
| | 管道符號 | 正則匹配管道左或右邊的模式 |
(…) | 圓括號 | 標記一個子表達式的開始和結束位置。可對其應用一個修飾符,至於結束括號後即可 |
[…] | 方括號 | 定義字符類(character class),匹配方括號列出的字符之一。在前方括號後加入^,即可匹配 除去方括號包含的字符 |
轉義序列
(escape sequences)
意義:匹配不太容易輸入的一個字符,或匹配某種類型的一個字符。
符號 | 註釋 |
---|---|
\n | 換行字符 |
\r | 回車字符 |
\t | 製表符 |
\s | 空白字符(whitespace character),等同[\n\r\t] |
\S | 非空白字符,等同[^\n\r\t] |
\d | 數字,等同[0-9] |
\D | 非數字,等同[^0-9] |
\w | 單詞字符,等同[a-zA-Z0-9_] |
\W | 非單詞字符,等同[^a-zA-Z0-9_] |
\b | 表示單詞邊界(起始/結束) |
\B | 表示非單詞邊界(非起始/結束) |
PHP中的正則函數
preg_match:
用來確認一個特定的字符串,是否匹配一個正則表達式。
preg_replace:
接受一個正則表達式和一個文本字符串,並嘗試在字符串中匹配該正則表達式。還接受另一個文本字符串,並用該字符串來替換每一次正則匹配。
preg_replace (regExp, replaceWith, OldString [, $limit = -1(無窮) [, int &$count ]] )
例子:
$test = preg_replace('/_([^_]+)_/', '<em>$1</em>');
// 每一個圓括號內,都包含了一個塊內容,而塊內容的名稱按$1、$2……依次遞增,在JScript 中則使用 $0…$9 屬性。
str_replace:
搜索字符串而非正則表達式模式,類似preg_replace函數,但比之更爲高效,對於不區別大小寫的簡單替換,可以用它來代替。
結語
正則表達式並沒有那麼容易,但無論如何,既然從事這個職業,既然愛上了編程和編程所涉及的部分方面,我們就應該去盡力做好,將正則寫的優雅而易讀,這並不能從技術上降低正規表達式的複雜性,但可以使它們更容易被理解。
By the way,匹配中文字符的正則表達式: [\u4e00-\u9fa5]。
參考資料:1
《PHP&MySQL Novice to Ninja》(Kevin Yank [澳])
正則表達式 - 菜鳥教程
preg-replace - 官方手冊
- 匹配時,
*
或+
會很貪婪(greedy)的包含儘可能多的字符。 ↩