Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

一上來就是最終Boss關的Regex

前情提要

常用表達式

abc -> 比對abc字串
^abc -> 比對以abc開頭的字串
abc$ -> 比對以abc結尾的字串
[abc] -> 比對abc任一文字
[0-9] -> 比對任一數字
[a-z] -> 比對任一小寫英文字
[^abc] -> 比對不含abc的字串

特殊表達式

. -> 任一字元(不含空白)
\ -> 跳脫特殊字元

\t -> TAB
\r -> 返回鍵(enter)
\n -> 換行
\f -> 換頁

\d -> 等價於[0-9]
\D -> 等價於[^0-9]
\w -> 等價於[a-zA-Z0-9_]
\W -> 等價於[^a-zA-Z0-9_]
\s -> 等價於[\r\t\n\f]

() -> 將括弧內的比對結果存入變數
[] -> 比對中括弧內的任一字元

* -> 比對前一字元任意次數
+ -> 比對前一字元1次以上
? -> 比對前一字元0或1次
{n} -> 比對前一字元n次
{n,} -> 比對前一字元n次以上
{n,m} -> 比對前一字元n次以上, m次以下

特殊表達式!

(?:abc|cde) -> 比對abc或cde但不記在變數
(?=abc) -> 比對以abc結尾的字串但不記在變數
(?!abc) -> 比對不以abc結尾的字串但不記在變數
\x -> 取出變數x的比對字串, x為>1的正整數

特殊表達式?!

ab.*d -> 比對'abcd', 'abccccd', 'abcdcccdcd' (盡可能的最大化比對)
ab.*?d -> 比對'abcd', 'abccccd', 'abcd'cccdcd (比對到最近的一個符合)

今日主題

  • 請開啟eclipse並以maven import softleader-training-regex專案

變數與Group

  • 透過以()將表達式的部分結果放入變數, 來輕易地做到替換, 擷取等動作
  • https://regex101.com/

期末考

  • 在resources底下有一個純文字檔, 裡面是Harvard的產品編號
  • 已知Harvard的卡片產品編號方式是

[卡別(A,B,C,D,E,M)<0~1碼>][西元年末兩位<2碼>]+[月份(1~9,o,n,d)<1碼>]+[流水號<4碼>]+[批號(B-Z-AA-ZZ)<0~2碼>]
例: 16n0127B,1720202B,1720202C,1720202D,A16n0126B,M16n0126C,M16n0126AA,M16n0126AB

  • 請根據上述規則實作tw.com.softleader.sample.havard.CardParser
    1. 挑出不合規則的產品編號
    2. 將產品編號轉為tw.com.softleader.sample.havard.model.Product

除了用來找東西以外還可以這樣做!

  • 情境:為了富邦的上傳400, Rhys開了XTF01~XTF20的Table, Dao都寫完了, 才發現泛型忘了加
  • 請將tw.com.softleader.sample.as400這個package下所有XTFxxDao的繼承加上泛型

超級期末考

  • 核心底層針對規則引擎做了一個優化: 呼叫formula
  • 其底層的實現就是先以regex將函式擷取運算出結果後替換回去
  • 已知函式規則如下, 請擷取出函式名稱+參數

#開頭, 函式名稱為純英數(不限字數), 參數用[``]包含, 有多個參數的情況下以,分隔, 允許空白, 函式內不會呼叫其他函式

  • 請實作出可以將函式擷取出來的regex

題目位於resources下的rule+formula.txt
建議直接利用regex101作答

  • 若已完成, 請思考該如何做到允許函式內呼叫函式(ps.純regex可能無法做到)