Number Regex
13 May 2013
最近現場反饋, 有報表導出來的字段, 在Excel 打開後出現顯示錯誤的情況, 查看導出的內容, 發現是這樣的一個情況, 字段的內容本來應該是一個文本的, 比如這樣:
123456E1
這樣的文本, 在Excel 打開後, 顯示成這樣了:
1.23456E6
也就是說被識別成一個用科學計數法表示的數字了.
既然這樣, 那麼只能對這樣的文本進行一些特殊處理, 不能直接原樣輸出, 而是要輸出成Excel 的文本格式才行, 比如直接在字符竄的前後都添加上製表符(\t), 但是現在的主要問題就是要匹配到這些數字格式的字符竄, 進行這樣的特殊處理.
一開始考慮使用下面這個正則表達式來進行匹配:
\d+(\.\d*)?([Ee]\d+)?
這樣可以匹配到整數, 浮點數, 還可以識別到科學計數法格式的數字, 貌似已經可以滿足要求了.
不過經過測試很快發現, Excel 還可以識別到整數部分不存在的數字, 比如:
.23
整數部分被當作0 來處理了(Java 中也是如此). 看來還得對上面的正則表達式進行改造才行, 很直接的一個, 就是下面的表達式:
\d*(\.\d*)?([Ee]\d+)?
然後, 一經測試就發現這樣的表達式不正確了, 這個表達式允許整數部分和小數部分都不存在了...嗯, 這兩部分, 至少要有一個部分存在才行, 正則表達式貌似沒有這樣的操作符? 看來只能折騰一下, 再增加一個表達式來判斷:
\d*\.?\d+([Ee]\d+)?
咋一看, 好像這個表達式就可以滿足所有的要求了, 可以匹配整數, 小數, 還可以匹配整數部分不存在的數字...但是再一看, 小數部分不存在的匹配不上了(小數部分不存在的也是合法的數字形式, 在Excel 和Java 都是)...
用"|" 把這兩個表達式連接起來:
(\d*(\.\d*)?([Ee]\d+)?)|(\d*\.?\d+([Ee]\d+)?)
看起來這樣就可以滿足要求了, 嗯, 對了, 還需要再把正負號加上:
([+\-]?\d*(\.\d*)?([Ee][+\-]?\d+)?)|([+\-]?\d*\.?\d+([Ee][+\-]?\d+)?)
暫時就只能想到這樣了, 不知是否還有更簡潔的形式...