Why
- 做過濾或驗證(錯誤,攻擊)
- 規範或限制文字的格式
- 提高效率
What
描述了一種字串匹配的模式
POSIX VS PERL
- The POSIX functions find the longest of the leftmost match, but PCRE stops on the first valid match
- As of PHP 5.3.0, the POSIX Regex extension is deprecated
POSIX | PCRE |
---|---|
ereg_replace()、eregi_replace() | preg_replace() |
ereg()、eregi() | preg_match() |
split()、 spliti() | preg_split() |
Android
- Kotlin 用 JVM 的 lib,所以 Pattern 同原生 Java
IOS
- Swift 用 ICU engine, Pattern
How
描述一種字串匹配的模式
-
delimiter
/^[^0-9]$/
#^[^0-9]$#
+^[^0-9]$+
%^[^0-9]$%
[^[^0-9]$]
(^[^0-9]$)
{^[^0-9]$}
-
中括號
[]
內沒有順序,是"或"的概念[a-zA-Z0-9] 數字 或 大小寫字母
-
開頭
^
結尾$
(在中括號外的意義) -
[]: 括號內的任何字元
[^]: 不在括號內的任何字元
Meta-characters
重複表示 | 規則 |
---|---|
? | 未出現或出現一次 |
* | 未出現或出現多次 |
+ | 出現一次或多次 |
{a} | 出現 a 次 |
{a,} | 至少出現 a 次以上 |
{,b} | 最多出現 b 次 |
{a,b} | 最少出現 a 次, 最多出現 b 次 |
Meta-characters 牛刀小試
-
/a?/
-
/123a{1,2}/
特殊字元
|
是或的意思
特殊字元 牛刀小試
- 2020 GO
[0-9]{3,}|\D$
[0-9]{3,}\D$
- 檢查是不是英數混和字串
$pattern = "/^([0-9A-Za-z]+)$/";
- 檢查是不是中文
- \X 是 an extended Unicode sequence
$pattern = "/^[\x{4E00}-\x{9FFF}]+$/u";
$pattern = "/^([\u4E00-\u9FFF]+)$/";
- \X 是 an extended Unicode sequence
-
Big 5:
- 每個中文字使用 2 bytes
- 部分文字用到了控制碼 所以許多程式與軟體都會有許、蓋、功這類中文字的沖碼問題
- 延伸字集中,有簡體字但是沒有定義日文字
-
UTF-8 :
- 採用變動大小,中文字使用 3 bytes,英文則維持 1 byte 因此若轉碼後,資料庫整體會變成 1.5 倍大,200MB(Big5) -> 300MB(UTF-8)
- 支援所有語言文字,還有一些怪怪圖形
- 簡體與正體中文重複字只定義一次,例如說,簡體的”山”,跟正體的”山” 是同一個 UTF-8 編碼
![](https://i.imgur.com/D37wa4P.png)
Regex Online
https://regex101.com/
https://rubular.com/
考前總複習,趕緊抱佛腳XD
- 2020-01-09
- 年-
/^(d{4})-/
- 月-
/((0([1-9]{1}))|(1[1|2]))-/
- 日
/(([0-2]([1- 9]{1}))|(3[0|1]))$/
- 年-
併起來:/^(d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1- 9]{1}))|(3[0|1]))$/
- URL(不是完整的)
/^(http(s)?:\/\/)?/
/[\w.-]+(\.[\w.-]+)+/
/[\w\-\._~:\/?#\[\]@!\$&'\(\)\*\+,;=.]+$/
併起來:^(http(s)?:\/\/)?[\w.-]+(\.[\w.-]+)+[\w-._~:\/?#\[\]@!\$&'\(\)\*\+,;=.]+$
- 應該要通過:
http://regex_101.com+
www.example.com
example.com
https://255.255.255.255
http://foo.com/blah_(wikipedia)#cite-1
https://www.example.com/foo/?bar=baz&inga=42&quux- 不能通過:
http:// shouldfail.com
http://.
http://?