正規表示式常見錯誤

2022-02-01 00:10:27 字數 1163 閱讀 9826

如果用 [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 天.

m/(

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

fd

正規表示式常見用法

正規表示式是處理字串的強大工具,具有特定的語法結構,可以實現字串的檢索 替換 匹配驗證等。第乙個引數傳入正規表示式,第二個引數傳入要匹配的字串 嘗試從字串的起始位置匹配正規表示式,如果匹配成功就返回匹配的結果,否則返回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...