Re: [問題] 使用正則表示式?

作者: TKB5566 (我們的元首阿道夫希特勒)   2023-05-08 21:28:18
藉這個標題回一下,關於regular expression,應該是先理解其本身的基本觀念,
接著再延伸到各個程式語言對regular expression的應用與變形,例如Java、JavaScript
所以一開始對regular expression的理解會是這樣:
[0123456789]
[9876543210]
[0-9]
\d
(1|2|3|4|5|6|7|8|9)
以上五種寫法都是表達同一種意思,即任一個數字字元。
那麼為何[0-9]可以,[9-0]就不可以呢?
因為若是採用[0-9]這種含有範圍字元的寫法,範圍字元左右兩邊,對應的ascii code
必須是小跟大;0的ascii code是48,9的ascii code是57,所以必須寫成[0-9]才行。
也就是說,大原則上regular expression底層是會被轉換成ascii code來執行。
或是這樣理解:
/d/D
/s/S
/w/W
.(加上空白字元)
以上四種寫法也都是一樣意思,表示任何一個字元;而
[0-9A-Za-z_]包含所有英數字元,也就是上面四種寫法減去部分特殊字元。
以上都是表達單一字元,若要表達多個字元,比方說4個數字字元。寫法可以是:
[0-9][0-9][0-9][0-9]
[0-9]{4}
\d\d\d\d
\d{4}
甚至是(1|2|3|4|5|6|7|8|9)重複寫4次。
可以看到不同語法的組合,可以產生很多種寫法。
而一個/一串字元,至少出現0次、至少出現1次、0或1次也都有對應的寫法:*、+、?。
另外還有否定意思的寫法:^;[^a]就是非a;[^ab]就是第一個字元非a,或是非b。
而[a^b]和[\^ab]都是一樣的意思,都是a、^、b三個字元任一即可。
作者: ssccg (23)   2023-05-09 08:14:00
後那段「Java的寫法」其實是Java literal string的寫法在literal string裡需要escape \,實際的string物件裡就跟原本的regex是一樣的,如果是用別的方式輸入例如檔案就不需要\\
作者: EijiHoba (我要好工作)   2023-08-10 08:50:00
謝謝分享

Links booklink

Contact Us: admin [ a t ] ucptt.com