[Regex] 正規表示式的應用

許多人很害怕 Regular Expressions, 除了它的確不好學之外, 主要是因為大家普遍不太了解它能拿來做什麼。所以我在這裡要陸續舉出一些實際上的應用範例, 向讀者們示範 Regular Expression 在實際生活中能幫我們解決什麼問題。依照我的慣例, 當我想到什麼, 就會在原來的文章裡直接修改, 不另做通知, 也不會再寫另一篇新的文章...

...繼續閱讀 »

[Regex] .Net 4.5 中新增的 Regex 建構式參數

我曾在「[Regex] 值得注意的 Regular Expression 樣式的潛在風險」一文中介紹過, Regex 樣式中若含有無意或惡意的某些寫法時, 可能會造成形同 DoS (Denial of Service, 阻斷式攻擊) 的問題, 使得伺服器運算器陷入無窮無盡的空轉運算中。事實上, 在撰寫正規運算式的樣式時, 的確很容易寫出有問題的樣式, 很多時候甚至不是刻意造成的; 愈是初學者, 愈容易造成這個問題...

...繼續閱讀 »

[Regex] 值得注意的 Regular Expression 樣式的潛在風險

Regex 本身已經十分複雜, 但不知道大家有沒有想過, 它的解析引擎和處理機制又是如何實作的呢? 一般來講, Regular Expression 的解析引擎可以分為三種, 一種叫做 DFA (Deterministic Finite Automation, 決定性有限自動機制), 另一種叫做 NFA (Nondeterministic Finite Automation, 非決定性有限自動機制), 還有一種叫做 POSIX NFA。.Net 採用了傳統的 NFA 引擎, 使得它既能兼顧速度與功能, 但缺點就是由於傳統 NFA 只接受它找到的第一個相符比對,它也可能讓其它比對無法被找到 (POSIX NFA 雖然可以找到, 但速度緩慢)...

...繼續閱讀 »

[Regex] 進階群組建構

當你可以掌握 Regex 的基本原則之後, 如果你真的把它運用在生活中或工作上, 我相信你很快就會發現那些基本技巧的不足之處。舉個例子, 你可能已經寫好一個樣式 (如 "(?\b\d{7,8}\b)" ) 來從 "12341234 1111222" 字串中擷取出電話號碼。然而, 你可能在某天發現來源字串出現了奇怪的字: "12341234 (02)12345678", 此時, 你就非得修改原本的樣式...

...繼續閱讀 »