0%

RegularExpression

Why

  • 做過濾或驗證(錯誤,攻擊)
  • 規範或限制文字的格式
  • 提高效率

What

描述了一種字串匹配的模式


POSIX VS PERL

  1. The POSIX functions find the longest of the leftmost match, but PCRE stops on the first valid match
  2. 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


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]+)$/";

  • Big 5:

    1. 每個中文字使用 2 bytes
    2. 部分文字用到了控制碼 所以許多程式與軟體都會有許、蓋、功這類中文字的沖碼問題
    3. 延伸字集中,有簡體字但是沒有定義日文字
  • UTF-8 :

    1. 採用變動大小,中文字使用 3 bytes,英文則維持 1 byte 因此若轉碼後,資料庫整體會變成 1.5 倍大,200MB(Big5) -> 300MB(UTF-8)
    2. 支援所有語言文字,還有一些怪怪圖形
    3. 簡體與正體中文重複字只定義一次,例如說,簡體的”山”,跟正體的”山” 是同一個 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://?

Thank You!