pretty code

2025年3月15日 星期六

grep 待解謎題

為了找出 instance,理論上同樣的 Tcl regex 應該也是可以用在 grep,但結果就是不行?

改用 -P 就可以?

或是拿掉 \] 也可以找出 non escaped identifier?

容我好好想想。


2025/03/15 晚上更新

還不確定為什麼,但知道解決辦法。

此篇文章給了我靈感,] 如果放在第一個字元(不算 ^),可以不需要跳脫符號,如此一來就可以找到那個 escaped identifier cell 了。

目前確定的是 sed 跟 grep 的行為都是一致。


2025/03/16 更新

原來一直都是我在亂用XD

正規表示法我最早學是在 Perl 裡,但只學些皮毛,後來大部分只用 C 後,便很少使用正規表示法。

後來又陸續多學了一些程式語言,直到現在,真的用 Linux 當開發環境,開始大量的使用 grep awk sed 這些好用的工具後,我終於嘗到苦果了XD

這樣也好,趁這個時候把 regex 的一些細節搞清楚。

當我們嘗試用工具或是程式語言來處理正規表示法的時候,第一件事一定要確定該工具或是該程式語言使用的是哪一種正規表示法!

目前比較熱門的大概有 3 派:

POSIX BRE - Basic Regular Expression
POSIX ERE - Extended Regular Expression
PCRE - Perl Compatible Regular Expression

BRE - grep, vi, sed
ERE - awk, egrep

我個人用的比較偏 ERE。

所以我們應該要 follow ERE 的標準。

而我最習慣也最常用的就是 [a-zA-Z0-9] 這樣的描述,在 BRE or ERE 中稱呼這樣的語法為 Bracket Expression

我這裡用 2004 版的 Spec 來描述,英文比較好懂。


從上面我們可以得知:

01. 特殊符號 .*[\,在 Bracket Expression 中不需要 escaped。
02. ] 因為是終止 Bracket Expression 用,有其特殊性,故要 match 它本身時,我們需要將其放在 Bracket Expression 裡的第一個字元,或是在 ^ 後面。

故我應該只要這樣下就可以了,少了跳脫符號,感覺清楚多了。


至於為什麼我在 Bracket Expression 裡面用 escaped  跳脫那些特殊符號也可以,這點我暫時還不知道是在那個 Spec 的條目中可以解釋就是了。

不過重點是,一樣的語法,我在 Tcl 中卻要跳脫,因為 Tcl 用的是一個叫 ARE 的派別,基本上是 ERE 的延伸,我覺得這是用正規表示法最麻煩的地方。

沒有留言: