如果用 [0-9]* 匹配 'a 1234 num', 備用狀態是否包括 'a .1234 num'(點號代表位置) ? (p.164)
答案是否定的. 星號限定的部分總是能夠匹配. 如果整個表示式都由星號控制, 它就能夠匹配任何內容. 在字串的開始位置, 傳動機構對引擎進行第一次嘗試時的狀態, 當然算匹配成功. 在這種情況下, 正規表示式匹配 '.a 1234 num', 而且在此處結尾 --- 它根本沒有觸及到那些數字.如果沒答對也不要緊, 因為這種情況還是有可能發生的. 如果在表示式中, [0-9]* 之後還出現了某些元素, 因為它們的存在, 引擎在達到下面狀態之前無法獲得全域性匹配:
______________________________
'a .1234 num' | .[0-9]*
--------------------------------------
那麼, 嘗試 '1' 會生成下面的狀態:
______________________________
'a .1234 num' | [0-9]* .
--------------------------------------
有序多選結構的陷阱
如何匹配乙個月中的日期? 假設乙個月固定有 31 天.fdm/(0?[1
-9]|
[12][0
-9]|
3[01])
/ ; wrong
當這個表示式匹配 jun 31 的時候, 其實得到的匹配是 3. 因為多選分支會先嘗試 0?[1-9], 因此得到匹配, 並終止了其它嘗試.
把能夠匹配的最短數字放到最後, 就可以解決問題.
正確的表達方法是:
m/([12][0-
9]|[
3][01]
|0?[
1-9])
/ ;right
正規表示式常見用法
正規表示式是處理字串的強大工具,具有特定的語法結構,可以實現字串的檢索 替換 匹配驗證等。第乙個引數傳入正規表示式,第二個引數傳入要匹配的字串 嘗試從字串的起始位置匹配正規表示式,如果匹配成功就返回匹配的結果,否則返回none import re content hello 1234 5678 wo...
正規表示式 常用正規表示式
一 校驗數字的表示式 1 數字 0 9 2 n位的數字 d 3 至少n位的數字 d 4 m n位的數字 d 5 零和非零開頭的數字 0 1 9 0 9 6 非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 7 帶1 2位小數的正數或負數 d d 8 正數 負數 和小數 d d 9 有兩位小數的...
正規表示式 常用正規表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 4 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 或者 1 3...