---
# System prepended metadata

title: 正規表示咒語詠唱術
tags: [雜七雜八的研究]

---

# 正規表示咒語詠唱術


[測試網頁](https://regex101.com/)

## 原文無字天書
``` 
Aug  9 02:36:29 192.168.12.34 CEF: 0|Acalvio|ShadowPlex|2022.5.4.0|16|"Vulnerability Exploited"|10|customer_id=yusawa customer_display_name=yusawaTech cat="Vulnerability Exploited" subCat="Intrusion Detected" sev=10 externalId=https://192.168.12.34/#/siem/incident/details?jobID=01d7db94-84a0-45f7-9457-d2f6fb8d4a53 start="Aug 09 2022 02:33:42.000 UTC" rt="Aug 09 2022 02:33:42.000 UTC" cs2Label=subnet cs2=192.168.12.0/24 src=192.168.12.208 dst=192.168.12.240 dhost=DESKTOP-181 dpt=445 app=microsoft-ds dmac=98:90:96:50:e1:d8 cs6Label=Intrusion_method_used cs6="OS-WINDOWS Microsoft Windows SMB large NT RENAME transaction request memory leak attempt" cs37Label=domain cs37=IT
```

## 咒語語法簡解
[欄位來源](https://atedev.wordpress.com/2007/11/23/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F-regular-expression/)

| 正規表示式    | 說明及範例                                                   | 比對不成立之字串         |
| ------------- | ------------------------------------------------------------ | ------------------------ |
| `a`         | 含字母 “a” 的字串，例如 “ab”, “bac”, “cba”                   | “xyz”                    |
| `a.`         | 含字母 “a” 以及其後任一個字元的字串，例如 “ab”, “bac”（若要比對`.`，請使用 `\.`） | “a”, “ba”                |
| `^xy`       | 以 “xy” 開始的字串，例如 “xyz”, “xyab”（若要比對 `^`，請使用 `\^`） | “axy”, “bxy”             |
| `xy$`      | 以 “xy” 結尾的字串，例如 “axy”, “abxy” （若要比對 `$`，請使用 `\$`） | “xya”, “xyb”             |
| `[13579]`       | 包含 “1” 或 “3” 或 “5” 或 “7” 或 “9” 的字串，例如：”a3b”, “1xy” | “y2k”                    |
| `[0-9]`         | 含數字之字串                                                 | 不含數字之字串           |
| `[a-z0-9]`      | 含數字或小寫字母之字串                                       | 不含數字及小寫字母之字串 |
| `[a-zA-Z0-9]`   | 含數字或字母之字串                                           | 不含數字及字母之字串     |
| `b[aeiou]t`     | “bat”, “bet”, “bit”, “bot”, “but”                            | “bxt”, “bzt”             |
| `[^0-9]`        | 不含數字之字串（若要比對 ^，請使用 `\^`）                      | 含數字之字串             |
| `[^aeiouAEIOU]` | 不含母音之字串（若要比對 ^，請使用 `\^`）                      | 含母音之字串             |
| `[^\^]`         | 不含 “^” 之字串，例如 “xyz”, “abc”                           | “xy^”, “a^bc”            |

| 正規表示式的特定字元 | 說明             | 等效的正規表示式 |
| -------------------- | ---------------- | ---------------- |
| `\d`                   | 數字             | [0-9]            |
| `\D`                   | 非數字           | [^0-9]           |
| `\w`                   | 數字、字母、底線 | [a-zA-Z0-9_]     |
| `\W`                   | 非數字、字母、底線 | [^a-zA-Z0-9_]    |
| `\s`                   | 空白字元         | [\r\t\n\f]      |
| `\S`                   | 非空白字元       | [^\r\t\n\f]     |

| 正規表示式 | 說明                                    |
| ---------- | --------------------------------------- |
| `a?`       | 零或一個 a（若要比對? 字元，請使用 `\?`） |
| `a+`       | 一或多個 a（若要比對+ 字元，請使用 `\+`） |
| `a*`       | 零或多個 a（若要比對* 字元，請使用 `\*`） |
| `a{4}`     | 四個 a                                  |
| `a{5,10}`  | 五至十個 a                              |
| `a{5,}`    | 至少五個 a                              |
| `a{,3}`    | 至多三個 a                              |
| `a.{5}b`   | a 和 b中間夾五個（非換行）字元          |

| 字元      | 說明                                                         | 簡單範例                                                     |
| --------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `\`         | 避開特殊字元                                                 | `A\*` 可用於比對 “A*”，其中 * 是一個特殊字元，為避開其特殊意義，所以必須加上 “\” |
| `^`| 比對輸入列的啟始位置                                         | `^A` 可比對 “Abcd” 中的 “A”，但不可比對 “aAb”                |
| `$`         | 比對輸入列的結束位置                                         | `A$` 可比對 “bcdA” 中的 “A”，但不可比對 “aAb”                |
| `*`         | 比對前一個字元零次或更多次                                   | `bo*` 可比對 “Good boook” 中的 “booo”，亦可比對 “Good bk” 中的 “b” |
| `+`         | 比對前一個字元一次或更多次，等效於 {1,}   | `a+` 可比對 “caaandy” 中的 “aaa”，但不可比對 “cndy”          |
| `?`         | 比對前一個字元零次或一次                                     | `e?l` 可比對 “angel” 中的 “el”，也可以比對 “angle” 中的 “l”  |
| `.`         | 比對任何一個字元（但換行符號不算）                           | `.n` 可比對 “nay, an apple is on the tree” 中的 “an” 和 “on”，但不可比對 “nay” |
| `(x)`       | 比對 x 並將符合的部分存入一個變數                            | `(a*) and (b*)` 可比對 “aaa and bb” 中的 “aaa” 和 “bb”，並將這兩個比對得到的字串設定至變數 RegExp.$1 和 RegExp.$2。 |
| `xy`        | 比對 x 或 y                                                  | `a*b*/g` 可比對 “aaa and bb” 中的 “aaa” 和 “bb”               |
| `{n}`       | 比對前一個字元 n 次，n 為一個正整數                          | `a{3}` 可比對 “lllaaalaa” 其中的 “aaa”，但不可比對 “aa”      |
| `{n,}`      | 比對前一個字元至少 n 次，n 為一個正整數                      | `a{3,}` 可比對 “aa aaa aaaa” 其中的 “aaa” 及 “aaaa”，但不可比對 “aa” |
| `{n,m}`     | 比對前一個字元至少 n 次，至多 m 次，m、n 均為正整數          | `a{3,4}` 可比對 “aa aaa aaaa aaaaa” 其中的 “aaa” 及 “aaaa”，但不可比對 “aa” 及 “aaaaa” |
| `[xyz]`     | 比對中括弧內的任一個字元                                     | `[ecm]` 可比對 “welcome” 中的 “e” 或 “c” 或 “m”              |
| `[^xyz]`    | 比對不在中括弧內出現的任一個字元                             | `[^ecm]` 可比對 “welcome” 中的 “w”、”l”、”o”，可見出其與 [xyz] 功能相反。（同時請注意 /^/ 與 [^] 之間功能的不同。） |
| `[\b]`      | 比對退位字元（Backspace character）                          | 可以比對一個 backspace ，也請注意 [\b] 與 \b 之間的差別      |
| `\b`        | 比對英文字的邊界，例如空格                                   | 例如 `\bn\w` 可以比對 “noonday” 中的 ‘no’ ; `\wy\b` 可比對 “possibly yesterday.” 中的 ‘ly’ |
| `\B`        | 比對非「英文字的邊界」                                       | 例如, `\w\Bn` 可以比對 “noonday” 中的 ‘on’ , 另外 `y\B\w` 可以比對 “possibly yesterday.” 中的 ‘ye’ |
| `\cX`       | 比對控制字元（Control character），其中 X 是一個控制字元     | `\cM` 可以比對 一個字串中的 control-M                        |
| `\d`        | 比對任一個數字，等效於 [0-9]                                 | `[\d]`可比對 由 “0” 至 “9” 的任一數字 但其餘如字母等就不可比對 |
| `\D`        | 比對任一個非數字，等效於 [^0-9]                              | `[\D]` 可比對 “w” “a”… 但不可比對如 “7” “1” 等數字           |
| `\f`        | 比對 form-feed                                               | 若是在文字中有發生 “換頁” 的行為 則可以比對成功              |
| `\n`        | 比對換行符號                                                 | 若是在文字中有發生 “換行” 的行為 則可以比對成功              |
| `\r`        | 比對 carriage return                                         |                                                              |
| `\s`        | 比對任一個空白字元（White space character），等效於 [\f\n\r\t\v] | `\s\w*` 可比對 “A b” 中的 “b”                                |
| `\S`        | 比對任一個非空白字元，等效於 [^\f\n\r\t\v]                  | `\S\w*` 可比對 “A b” 中的 “A”                                |
| `\t`        | 比對定位字元（Tab）                                          |                                                              |
| `\v`        | 比對垂直定位字元（Vertical tab）                             |                                                              |
| `\w`        | 比對數字字母字元（Alphanumerical characters）或底線字母`（”_”）`，等效於 [A-Za-z0-9_] | `\w` 可比對 `.A _!9` 中的 `A`、`_`、`9`。                    |
| `\W` | 比對非「數字字母字元或底線字母」，等效於 [^A-Za-z0-9_] | `\W` 可比對 `.A _!9` 中的 `.`、` `、`!`，可見其功能與 `\w` 恰好相反。 |
| `\ooctal` | 比對八進位，其中octal是八進位數目 | `\oocetal123` 可比對 與 八進位的ASCII中 “123” 所相對應的字元值。 |
| `\xhex`   | 比對十六進位，其中hex是十六進位數目 | `\xhex38` 可比對 與 16進位的ASCII中 “38” 所相對應的字元。 |

## 咒語語法詳解

### 欄位標題

| 語法 | 用途| 範例 |
| -------- | -------- | -------- |
| `(?P<str>)` | 為欄位取名 | `(?P<Mon>)`|

使用方式為`(?P<欄位名稱>)`，他就會幫欄位取名，但不能用中文
![](https://hackmd.io/_uploads/rks6Qbjhh.png)

---

### 正規表示式

| 語法 | 說明及範例 | 比對不成立的字元 |
| -------- | -------- | -------- |
| `a` | 含字母 “a” 的字元，例如 “ab”, “bac”, “cba” | `zxc` |

![](https://hackmd.io/_uploads/rykbbMi2h.png)

---

| 語法 | 說明及範例 | 比對不成立的字元 |
| -------- | -------- | -------- |
| `[13579]` | 包含 “1” 或 “3” 或 “5” 或 “7” 或 “9” 的字串，例如：”a3b”, “1xy” | “y2k” |
| `[0-9]` | 含數字之字串 | 不含數字之字串  |
| `[a-z]` | 含小寫字母之字串 | 不含小寫字母之字串 |
| `[A-Z]` | 含大寫字母之字串 | 不含大寫字母之字串 |
| `b[aeiou]t` | “bat”, “bet”, “bit”, “bot”, “but” | “bxt”, “bzt” |
| `[^0-9]` | 不含數字之字串（若要比對 ^，請使用 `\^`） | 含數字之字串 |
| `[^aeiouAEIOU]` | 不含母音之字串（若要比對 ^，請使用`\^`）| 含母音之字串 |
| `[^\^]` | 不含 “^” 之字串，例如 “xyz”, “abc” | “xy^”, “a^bc” |

![](https://hackmd.io/_uploads/HkxDZPsnh.png)

![](https://hackmd.io/_uploads/BJvZfDi22.png)

也可以自訂數字範圍，比如`[2-9]`，他就不會去匹配0、1
![](https://hackmd.io/_uploads/B1Gwzvon3.png)

![](https://hackmd.io/_uploads/rJ7CNwjhn.png)

![](https://hackmd.io/_uploads/HkoZrDo23.png)

這種匹配法都可混用，也可自訂要抓的範圍或文字
![](https://hackmd.io/_uploads/HJhwSDi2h.png)




---

### 正規表示式的特定字元

| 語法 | 用途 | 等效的正規表示式 | 範例 |
| -------- | -------- | -------- | -------- |
| `\S` | 比對所有非空白字元 | `[^\r\t\n\f]` | `(?P<Mon>\S)`|
| `\s` | 比對所有空白字元 | `[\r\t\n\f]` | `(?P<Mon>\s)`|

![](https://hackmd.io/_uploads/r12wrbs23.png)

![](https://hackmd.io/_uploads/HkwdrWsh3.png)

---

| 語法 | 用途| 等效的正規表示式 | 範例 |
| -------- | -------- | -------- | -------- |
| `\W` | 比對所有非數字、字母、底線，就是=、+、/這些特殊符號 | `[^a-zA-Z0-9_]` | `(?P<Mon>\W)`|
| `\w` | 比對所有數字、字母、底線 | `[a-zA-Z0-9_]` | `(?P<Mon>\w)`|

![](https://hackmd.io/_uploads/Sku3LWj3h.png)

![](https://hackmd.io/_uploads/r1S6IWinh.png)

---

| 語法 | 用途| 等效的正規表示式 | 範例 |
| -------- | -------- | -------- | -------- |
| `\D` | 比對所有非數字 | `[^0-9]` | `(?P<Mon>\D)`|
| `\d` | 比對所有數字 | `[^0-9]` | `(?P<Mon>\d)`|

![](https://hackmd.io/_uploads/HkQTuWj3n.png)

![](https://hackmd.io/_uploads/ryRpObs32.png)

---

### 特殊符號

| 語法 | 說明 | 範例 |
| -------- | -------- | -------- |
| `*` | 比對前面零或多個字元 | `(?P<Mon>\S*)`|

加了`*`才會選擇完整的字串，不然他會把字個別分開
這裡用/S來抓非空白的字元
![](https://hackmd.io/_uploads/rylpq-i2h.png)

有星號的欄位
![](https://hackmd.io/_uploads/H1cEoZjnh.png)

沒星號的欄位
![](https://hackmd.io/_uploads/HklIo-o32.png)

可直接比對所需字元
這邊給`Au*`，他會比對文內所有含Au及u前的字元，所以會抓到A
![](https://hackmd.io/_uploads/Bkz7T-s23.png)

---

| 語法 | 說明 | 範例 |
| -------- | -------- | -------- |
| `+` | 比對前一個字元一次或更多次，等效於 {1,} | `(?P<Mon>\S+)`|

跟`*`使用起來差不多
![](https://hackmd.io/_uploads/B1sf0No2n.png)

但如果用`+`的話，他不會跟`*`一樣去對其他地方的單字元做比對
![](https://hackmd.io/_uploads/SkSuZrj3n.png)

---

| 語法 | 說明 | 範例 |
| -------- | -------- | -------- |
| `?` | 比對前一個字元零次或一次 | `(?P<Mon>Au?)`|
>`?`表示放在其他字符後面表示前面的字符可以有，也可以沒有，或者放在`*`、`+`後面表示匹配盡可能少的字符
>例如：字符串fooooo，正則來`fo*`和`fo+`會匹配整個字符串，`fo+?` 匹配fo，`fo*？`匹配f

跟`*`差不多的用法，但可以做搭配
![](https://hackmd.io/_uploads/H1S5gUsnh.png)

使用`*?`代表匹配u前的A字元，不會匹配到u
![](https://hackmd.io/_uploads/ryWoe8jnh.png)

使用`+?`代表匹配Au字元
![](https://hackmd.io/_uploads/HyVneIo2h.png)

---

| 語法 | 範例 | 說明 | 比對不成立的字元 |
| -------- | -------- | -------- | -------- |
| `.` | `a.` | 含字母 “a” 以及其後任一個字元的字串，例如 “ab”, “bac”（若要比對.，請使用 `\.`） | `a`, `ba` |

![](https://hackmd.io/_uploads/SyZwdMjh3.png)

可以透過`{數字}`來指定要抓`a`後多少個字元
如圖範例就是`a+後3`個字元
![](https://hackmd.io/_uploads/rk1q_zj3n.png)

---

| 語法 | 範例 | 說明 | 比對不成立的字元 |
| -------- | -------- | -------- | -------- |
| `^` | `^xy` | 以 “xy” 開始的字串，例如 “xyz”, “xyab”（若要比對^，請使用 `\^`） | `axy` , `bxy` |

只抓Au開始的字元，像最後一行asdAu的Au在後面，就不列入抓取範圍
![](https://hackmd.io/_uploads/SkAHofsn3.png)

---

| 語法 | 範例 | 說明 | 比對不成立的字元 |
| -------- | -------- | -------- | -------- |
| `$` | `xy$` | 以 “xy” 結尾的字串，例如 “axy”, “abxy” （若要比對`$`，請使用 `\$`） | `xya` , `xyb` |

只抓IT結尾的字元，像其他行的IT在前面或中間，就不列入抓取範圍
![](https://hackmd.io/_uploads/H1R3OEs22.png)

---

| 語法 | 說明 | 範例 |
| -------- | -------- | -------- |
| `a{n}`     | 比對前一個字元 n 次                   | `(?P<Mon>w.{5}` |
| `a{n,m}`  | 比對前一個字元至少 n 次，至多 m 次       | `(?P<Mon>w.{1,10}` |
| `a{n,}`    | 比對前一個字元至少 n 次                | `(?P<Mon>w{5,})` |
| `a{,m}`    | 比對前一個字元至多 m 次                |  |
| `a.{n}b`   | a 和 b中間夾 n 個（非換行）字元          | `(?P<Mon>w.{5}t`  |

匹配w後+5個字元
![](https://hackmd.io/_uploads/HJOVUIj3h.png)

匹配w後1到10個字元
![](https://hackmd.io/_uploads/SkPmIIohh.png)

匹配超過5個w字元的字串
![](https://hackmd.io/_uploads/BkQ8TUs2n.png)


匹配w到t之間有5個字元的地方，如果超過或不到就不匹配
![](https://hackmd.io/_uploads/rkBK88snn.png)


---

## 咒術詠唱

```
(?P<date>\w{3}\s+\d+\s+\S+)\s+(?P<IP>\S+)\s+\S+\s\d+\|(?P<aaa>[^|]*)\|(?P<bbb>[^|]*)\|(?P<ccc>[^|]*)\|(?P<ddd>[^|]*)\|\"\w[^=]*=(?P<customer_id>\S+)\s\w[^=]*=(?P<customer_display_name>\S+)\s.*externalId=(?P<externalId>[^\s]*)\s+\w*\=\"(?P<start>\w{3}\s+\d+\s+\d+\s\S+\s\w+)\"\s.*src=(?P<src>\S*)\s+dst=(?P<dst>\S*)\s.*dpt=(?P<dpt>\S*)\s+.*
```
![](https://hackmd.io/_uploads/HkSjdvo22.png)

![](https://hackmd.io/_uploads/ry0h_vsh2.png)
