今天空免,一位想當全棧產品經理的同事犁河,問了我一個sql相關的問題:如何查詢出同時包含aeiou且名字之間沒有空格的世界國家名技竟?
拿到題目第一反應是like '%a%' or like? '%e%'...不過貌似沒法保證同時出現(xiàn)aeiou遂放棄缩幸。 然后想使用正則千贯,可是貌似沒有用like寫過正則的經驗,后來上網查晌坤,發(fā)現(xiàn)oracle內置regex_like(str, 'pattern')的方法逢艘,剩下的工作就是寫正則了旦袋,可是想了好久發(fā)現(xiàn)好像沒那么簡單:和like相同需要考慮aeiou的出現(xiàn)順序,而這是無法保證的它改。
這邊一時半會解決不了疤孕,但是沒有停止思考,回家的路上就想著可以通過內置函數(shù)解決字符串中是否包含多個指定字符的辦法:
這種通過長度判斷是否包含空格的方法是上次解決另外一個問題的方法化用的央拖,上次需要判斷查詢字段是否包含中文祭阀,就是利用中文字符和英文字符在utf -8編碼下占位數(shù)不同來計算的,當然這種處理辦法(是否包含中文)還得仰仗數(shù)據(jù)庫編碼大哥鲜戒。
回復完同事专控,自己繼續(xù)瞎折騰正則,說折騰其實是補課遏餐,發(fā)這貼不是想揭露同事提的問題的正則解法伦腐,因為沒有解出來:(?
主要是通過這次機會,回顧了正則的使用和一些高級用法(其實就是之前學習不認真欠下的債)
這次補習的內容就是非捕獲寫法失都?: 以及正向預測柏蘑?=還有反向預測?粹庞!三者的區(qū)別——
咳焚?: 就是表示在括弧中不被捕獲(匹配緩存起來,有0-99個槽)
庞溜?= 所謂正向預測先行革半,基本用法為xxx? (?=A|b|c)? 這里是假定會出現(xiàn)會出現(xiàn)字符模式 xxx A,如果出現(xiàn)這個串的話流码,就繼續(xù)往后匹配xxx b, 若存在就捕獲xxx b中的xxx部分(使用替換只會替換這個匹配到的xxx)
又官?!就是反向預測先行旅掂,與正向相反赏胚,他會往前匹配并且會包含自身。
下面用例子說明:
最后推薦下菜鳥正則學習網商虐,清晰易懂,還有就是能直接生成匹配代碼:)