前段時間做一個任務:從 log文件 中提取出 java異常(Exception)的相關信息。 log文件的每一行都有固定的格式:包括 時間戳、信息類型、信息內容 等等。
一開始我想這是不是得用編譯原理那套工具 lex、yacc 來做?當時做大作業的時候感覺它們真的是無比強大啊!但仔細一想,覺得沒有必要:
每行文本有多項數據,每項數據都識別為一個記號(token),太麻煩了!
沒有什麼語法,每一行就是各項數據的一個組合,順序是一成不變的。
因此我想直接用 String 的各個方法來分析算了,結果事半功倍!其中用到了如下一些方法:
split
這是最重要的一個方法,拆分各個字段就靠它了,如:
"a b c".split(" ")
// 將得到 {"a", "b", "c"}
分隔符是一個正則表達式:
"a,b:c".split(",|:")
// 也會得到 {"a", "b", "c"}
String 中正則表達式的格式可看: 正則表達式格式簡介,見這裡。
replaceAll
replaceAll 是替換字符串的方法,但我用的卻是它的隱藏功能:刪除子字符串(替換為空字符串):
"abc;".replaceAll(";", "")
// 將得到 "abc"
replaceAll 的第一個參數是正則表達式。
trim
一般用於去掉頭尾的空格:
" a bc ".trim()
// 將得到 "a bc"
indexOf 和 lastIndexOf
這是一套用於定位字符/子字符串的重裝方法。需要注意的是 indexOf('a') 比 indexOf("a") 的效率要高,盡管它們的作用相同。
substring
這是一套截取子字符串的重裝方法。 分析文本時可配合 indexOf 使用。
startsWith 和 endsWith 以及 contains
判斷是否包含某字符串。
以上各個操作也許看起來並不如何強大,但是如果組合、連接起來用,分析固定格式的文本綽綽有余!