背景:
前幾天拿來apache日志,用hive的正則進行匹配,發現匹配出來的字段算是NULL,但是我用RegexBuddy工具顯示能夠匹配的到啊!例子如下(我拿正常的apache日志來比較,我的apache日志格式被更改過)
1、apache日志格式:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
2、正則表達式:
([^ ]*) ([^ ]*) ([^ ]*) (-|\[[^\]]*\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?
3.工具匹配后結果:

4.把正則拿到hive里面做create table操作,結果匹配出的全是null,之后查閱了資料吧正則寫成如下格式就可以匹配了(多了轉義符號):
主要原因有兩個之后會詳細講解。
原因:
1、首先理解下轉義字符,就是把具有特殊意義的字符例如?或[等。編程"單純"的字符串,例如"\?"就表示'?'本身。
2、但是在方括號里面情況有點復雜:
如果你想匹配*?+這樣的字符,第一點想到的是[\*\?\+];
首先要理解的是,在hive中‘\’本身就代表轉義字符,這與原有正則里面的轉義,也有點不同,意思是:要經過兩次轉義后(hive
和正則)才會匹配,我們在背景里面單一的做了正則的轉義,而沒有做hive的轉義(這里面有點混亂,需要讀者自己理清楚),但是在再加上一個轉義符號后,就變得正常。我們的例子來說正常的hive寫法應該為[\\*\\?\\+]。
這里只是基本的一些想法,也是看了別人的文章總結的:
Oracle,green plum,hive中正則表達式的元字符轉義比較雜談
