[TOC]
# 正則表達式-語法
## 普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數字、所有標點符號和一些其他符號。
| 字符 | 描述 |
| --- | --- |
| \[ABC\] | 匹配\[...\]中的所有字符,例如\[aeiou\]匹配字符串 "google runoob taobao" 中所有的 e o u a 字母。|
| \[^ABC\] |匹配除了\[...\]中字符的所有字符,例如\[^aeiou\]匹配字符串 "google runoob taobao" 中除了 e o u a 字母的所有字母。|
| \[A-Z\] | \[A-Z\] 表示一個區間,匹配所有大寫字母,\[a-z\] 表示所有小寫字母。 |
| . | 匹配除換行符(\\n、\\r)之外的任何單個字符,相等于 \[^\\n\\r\]。 |
| \[\\s\\S\] | 匹配所有。\\s 是匹配所有空白符,包括換行,\\S 非空白符,包括換行。 |
| \\w | 匹配字母、數字、下劃線。等價于 \[A-Za-z0-9\_\] |
## 非打印字符
非打印字符也可以是正則表達式的組成部分。下表列出了表示非打印字符的轉義序列:
| 字符 | 描述 |
| --- | --- |
| \\cx | 匹配由x指明的控制字符。例如, \\cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。 |
| \\f | 匹配一個換頁符。等價于 \\x0c 和 \\cL。 |
| \\n | 匹配一個換行符。等價于 \\x0a 和 \\cJ。 |
| \\r | 匹配一個回車符。等價于 \\x0d 和 \\cM。 |
| \\s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 \[ \\f\\n\\r\\t\\v\]。注意 Unicode 正則表達式會匹配全角空格符。 |
| \\S | 匹配任何非空白字符。等價于 \[^ \\f\\n\\r\\t\\v\]。 |
| \\t | 匹配一個制表符。等價于 \\x09 和 \\cI。 |
| \\v | 匹配一個垂直制表符。等價于 \\x0b 和 \\cK。 |
## 特殊字符
所謂特殊字符,就是一些有特殊含義的字符,如上面說的runoo\*b中的\*,簡單的說就是表示任何字符串的意思。如果要查找字符串中的\*符號,則需要對\*進行轉義,即在其前加一個\\:runo\\\*ob匹配 runo\*ob。
許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜杠字符\\放在它們前面。下表列出了正則表達式中的特殊字符:
| 特別字符 | 描述 |
| --- | --- |
| $ | 匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\\n' 或 '\\r'。要匹配 $ 字符本身,請使用 \\$。 |
| ( ) | 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \\( 和 \\)。 |
| \* | 匹配前面的子表達式零次或多次。要匹配 \* 字符,請使用 \\\*。 |
| + | 匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \\+。 |
| . | 匹配除換行符 \\n 之外的任何單字符。要匹配 . ,請使用 \\. 。 |
| \[ | 標記一個中括號表達式的開始。要匹配 \[,請使用 \\\[。 |
| ? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \\?。 |
| \\ | 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\\n' 匹配換行符。序列 '\\\\' 匹配 "\\",而 '\\(' 則匹配 "("。 |
| ^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配 ^ 字符本身,請使用 \\^。 |
| { | 標記限定符表達式的開始。要匹配 {,請使用 \\{。 |
| | | 指明兩項之間的一個選擇。要匹配 |,請使用 \\|。 |
## 限定符
限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。有\*或+或?或{n}或{n,}或{n,m}共6種。
正則表達式的限定符有:
| 字符 | 描述 |
| --- | --- |
| \* | 匹配前面的子表達式零次或多次。例如,zo\* 能匹配 "z" 以及 "zoo"。\* 等價于{0,}。 |
| + | 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。 |
| ? | 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價于 {0,1}。 |
| {n} | n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 |
| {n,} | n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o\*'。 |
| {n,m} | m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數之間不能有空格。 |
## 定位符
定位符使您能夠將正則表達式固定到行首或行尾。它們還使您能夠創建這樣的正則表達式,這些正則表達式出現在一個單詞內、在一個單詞的開頭或者一個單詞的結尾。
定位符用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結束,\\b描述單詞的前或后邊界,\\B表示非單詞邊界。
正則表達式的定位符有:
| 字符 | 描述 |
| --- | --- |
| ^ | 匹配輸入字符串開始的位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與 \\n 或 \\r 之后的位置匹配。 |
| $ | 匹配輸入字符串結尾的位置。如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與 \\n 或 \\r 之前的位置匹配。 |
| \\b | 匹配一個單詞邊界,即字與空格間的位置。 |
| \\B | 非單詞邊界匹配。 |
# 正則表達式 -修飾符(標記)
標記也稱為修飾符,正則表達式的標記用于指定額外的匹配策略。
標記不寫在正則表達式里,標記位于表達式之外,格式如下:
~~~
/pattern/flags
~~~
下表列出了正則表達式常用的修飾符:
| 修飾符 | 含義 | 描述 |
| --- | --- | --- |
| i | ignore - 不區分大小寫 | 將匹配設置為不區分大小寫,搜索時不區分大小寫: A 和 a 沒有區別。 |
| g | global - 全局匹配 | 查找所有的匹配項。 |
| m | multi line - 多行匹配 | 使邊界字符^和$匹配每一行的開頭和結尾,記住是多行,而不是整個字符串的開頭和結尾。 |
| s | 特殊字符圓點.中包含換行符\\n | 默認情況下的圓點.是 匹配除換行符\\n之外的任何字符,加上s修飾符之后,.中包含換行符 \\n。 |
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron