要求將原數據【A列】轉換成C列到I列的結果 如下圖所示: ![]() 文章中用條件分組按要求提取目標字符。 這篇文章的素材來源于ExcelHome論壇的提問。在原貼的下面,網友無關歲月寫了一個正則公式: =REGEXEXTRACT(A2,"(?|(\d+月)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+)|()(.+)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+))",2) ![]() 這個正則公式有兩個比較冷門的知識點。 知識點1: REGEXEXTRACT第三參數為2,以數組的形式返回第一個匹配項中的捕獲組 詳見前幾天的介紹文章 知識點2: 使用了分支重置組。 本文是龍逸凡學習分支重置組的筆記,供大家參考,如有錯誤,敬請指正。 分組基礎知識 在正則中,為了限定量詞的作用范圍、或為了方便后面的正則或替換參數中引用,會將某些連續的子表達式用括號括起來。 比如 上面公式的第三參數中的\1引用第二參數的第一個括號的匹配結果。 提取第二個空格后的內容。 公式: =REGEXP(A1,"^(\S+\s+){2}",2) ![]() 用括號將S+\s+括起來,后面跟一個{2},表明將括號里的正則重復兩次。 括號是限定量詞作用范圍。 上面的括號叫捕獲分組。捕獲分組都有默認的編號:\1、\2、\3…… 可以用編號\1、\2來引用它們的匹配結果。 編號規則: 從左到右按照左括號 ( 的出現順序進行編號,起始編號為 1。 ![]() ![]() 分支重置組 但是有時候,為了處理方便,希望編號并不是按上面的規則。各分支結構的編號都是從某個編號起編,也就是說,在各分支結構中,有相同的編號。 這就要用到分支重置組。 (?|分支1|分支2|……) 比如前面提到的無關歲月寫的正則公式: =REGEXEXTRACT(A2,"(?|(\d+月)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+)|()(.+)\n(.+)\n(.+)\n(.+)\n(.+)\n(.+))",2) 編號并不是從左到右,是\1、\2……\13、\14 而是從\1到\7,在下一個分支又是從\1到\7 ![]() 應用案例1 從不同的格式的聯系電話中分別提取區號和電話號碼 公式: =REGEXEXTRACT(A2,"(?|\+86 (\d{2})-(\d{8})|()(\d{8}))",2) ![]() 應用案例2 從15位或18位的身份證號中提取出生日期 公式: =REGEXP(A2,"^(?|.{6}(....)(..)(..).{4}|.{6}(..)(..)(..).{3})",2,"\1-\2-\3") ![]() 本案例也可不用分支重置組。 下面是Excel偷懶的技術讀者9群群友景鯉和?? ?? ?? ?? ?? ??寫的公式。 景鯉的公式: =REGEXP(A2,".{6}(.{2,4})(..)(..).{3,4}",2,"\1-\2-\3") ?? ?? ?? ?? ?? ??寫的公式 =REGEXP(A2,".{6}(.{,4})(..)(..)....?",2,"\1-\2-\3") 另外,也可使用錯位拼接法 公式: =REGEXP(A2,"^.{6}(\d{2})(\d{2})(\d{2}).{3}$|^.{6}(\d{4})(\d{2})(\d{2}).{4}$",2,"\1\4-\2\5-\3\6") ![]() 本案例用分支重組法和錯位拼接法,是將簡單問題復雜化了,僅作為學習參考。平時實戰,還是得用景鯉和?? ?? ?? ?? ?? ??寫的正則公式。 |
|