原來寫過一篇關於正規表示式的文章,這裡再補充幾個實際專案中用到的例子.注意:下面樣例都是scala**
1 捕獲組命名
使用捕獲組的時候,程式設計師可能需要趴在顯示器上,用一張紙擋著螢幕,從左往右數括號,聚精會神好像拆彈,而且正規表示式一旦發生變化,group的index也會變.有潔癖的程式設計師不願意忍受下面的**中的那個2
val matcher = pattern.compile("""(中標金額:|預算:)(\d+)元""").matcher("預算:4356元")if(matcher.find())
因此可以把捕獲組命名
val matcher = pattern.compile("""(中標金額:|預算:)(?\d+)元""").matcher("預算:4356元")if(matcher.find())
2 零寬度斷言
零寬度斷言只用來判斷,而不會消費字串,不會影響其他部分的匹配.
先舉乙個負向斷言的例子,假設有幾個檔案全名,"file1.***", "file2.bat", "file3.txt",需要把檔名和副檔名都提取出來,在這個過程中,需要忽略所有bat檔案.要是用普通**實現,至少需要兩個步驟——分隔和判斷,但是正規表示式寫乙個就行了,用來面試別人,效果非常好
val pattern = pattern.compile("""(\w+)\.(?!bat|***)(\w+)""")array("file1.***","file2.bat","file3.txt").foreach(s=> })
至於正向斷言,在2023年以後的很長一段時間,我都沒想明白它到底有什麼實際的作用,能用正向斷言時為什麼不用非捕獲組.
後來終於找到了乙個可以名正言順使用正向斷言的例子,用正規表示式來實現,效果拔群,立竿見影,感覺特別奇技淫巧.那就是密碼強度判斷,比如要求密碼8到12位,必須有大小寫字母和數字
val pattern = pattern.compile("""^(?=.*[a-z])(?=.*[a-z])(?=.*[0-9]).""")array("qweqwe123","qwer56","qweqwe123").foreach(s=>)
斷言的好處是可以要求同時出現而且沒有先後順序
python高階之正則中的分組
import re phone number phone 15647854549 分組 match obj re.match phone 1 0 9 phone number if match obj result match obj.group print result phone 1564785...
Python 正則高階運用
常用函式 match 決定 re 是否在字串剛開始的位置匹配 search 掃瞄字串,找到這個 re 匹配的位置 findall 找到 re 匹配的所有子串,並把它們作為乙個列表返回 finditer 找到 re 匹配的所有子串,並把它們作為乙個迭代器返回 修飾符 上面函式第三個引數 dotall,...
Python高階正則
1 importre2 3 p re.compile 0 9 45 m p.match 13435asadb 67print m.group 一 上面的第二行和第三行也可以合併成一行來寫 m p.match 0 9 13435asadb 效果是一樣的,區別在於第一種方式是提前對要匹配的格式進行編譯,...