summaryrefslogtreecommitdiffhomepage
path: root/zh-tw/pcre-tw.html.markdown
blob: 3b2ff3f708a38306215ca31d32c629edb920fcf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
---
language: PCRE
filename: pcre-tw.txt
contributors:
    - ["Sachin Divekar", "http://github.com/ssd532"]
translators:
    - ["Michael Yeh", "https://hinet60613.github.io/"]
lang: zh-tw
---

正規表達式(regular expression,或縮寫為regex, regexp)是一種用來表示搜尋模式的特殊字串。例如,你可以用`/^[a-z]+:/`來從網址`http://github.com`中擷取出`http:`這段http協定名稱。

相容Perl正規表達式(Perl Compatible Regular Expressions, PCRE)是一個實作正規表達式的C語言函式庫。此函式庫在1997年被開發出來,在當時面對複雜字串處理時大多會選擇使用Perl。也因為如此,PCRE大多的正規表達式語法都很酷似Perl。PCRE語法被廣泛運用在許多大專案中,包括PHP、Apache、R等。

PCRE中的超字元(metacharacter)主要可以分為以下兩類:

* 在中括號外會被辨識的字元

```
  \      通用跳脫字元
  ^      字串開頭 或 行首
  $      字串結尾 或 行尾
  .      除了換行符號外的任何字元
  [      字元集合定義開始
  |      支流開始
  (      子串模式定義開始
  )      子串模式定義結束
  ?      extends the meaning of (
         同時為數量0或1配對
         also quantifier minimizer
  *      量詞 至少0個 至多無限個
  +      量詞 至少1個 至多無限個
         同時為佔有型量詞
  {      最大/最小量詞開始
```

* 在中括號內會被辨識的超字元,在中括號外會被視為字元集合使用

```
  \      通用跳脫字元
  ^      非字元集合的字,但只會抓到第一個符合的字元
  -      字元範圍
  [      POSIX字元集合(若後面接POSIX格式)
  ]      字元集合定義結束
```

PCRE提供了一些通用的字元類型,可被當作字元集合使用

```
  \d     任何數字字元
  \D     任何非數字字元
  \h     任何水平空白字元
  \H     任何非水平空白字元
  \s     任何空白字元
  \S     任何非空白至元
  \v     任何垂直空白字元
  \V     任何非垂直空白字元
  \w     任何英文字
  \W     任何非英文字
```

## 範例

我們以字串 `66.249.64.13 - - [18/Sep/2004:11:07:48 +1000] "GET /robots.txt HTTP/1.0" 200 468 "-" "Googlebot/2.1"` 作為範例,這是一個標準的Apache存取記錄。

| 正規表達式 | 結果          | 說明 |
| :---- | :-------------- | :------ |
| GET   | GET | GET 抓取 GET 字串 (會分別大小寫) |
| \d+.\d+.\d+.\d+ | 66.249.64.13 | `\d+` 抓取數字字元,數量由 `+` 定義為至少一個至多無限個。 `\.` 抓取 `.` 字元 |
| (\d+\.){3}\d+ | 66.249.64.13 | `(\d+\.){3}` 會試著抓取剛好三次的 (`\d+\.`) |
| \[.+\] | [18/Sep/2004:11:07:48 +1000] | `.+` 抓取除了換行符號以外的任何字元, `.` 表示任意字元 |
| ^\S+ | 66.249.64.13 | `^` 為行首, `\S+` 抓取至少一個非空白字元 |
| \+[0-9]+ | +1000 | `\+` 抓取 `+` 字元。 `[0-9]` 字元集表示剛好一個數字字元。 可以用 `\+\d+` 達到相同效果。 |

以上範例皆可在 [regex101.com](https://regex101.com/) 測試,步驟如下:

1. 複製範例字串到 `TEST STRING` 區域
2. 複製正規表達式字串到 `Regular Expression` 區域
3. 網頁會顯示自動表達式抓取結果