快速開始
教學
工具和語言
範例
參考
書籍評論
範例
正規表示式範例
數字範圍
浮點數
電子郵件地址
IP 地址
有效的日期
數字日期轉換為文字
信用卡號碼
比對完整行
刪除重複行
程式設計
兩個相近的字詞
陷阱
災難性的回溯
過多重複
拒絕服務
讓所有內容變成可選
重複擷取群組
混合 Unicode 和 8 位元
此網站的更多資訊
簡介
正規表示式快速開始
正規表示式教學
替換字串教學
應用程式和語言
正規表示式範例
正規表示式參考
替換字串參考
書籍評論
可列印 PDF
關於此網站
RSS Feed 和部落格
RegexMagic—Generate regular expressions matching floating point numbers

使用正規表示式比對浮點數

這個範例說明如何避免不熟悉 正規表示式 的人常犯的常見錯誤。例如,我們將嘗試建立一個正規表示式,可以比對任何浮點數。我們的正規表示式也應該比對整數和浮點數,其中未提供整數部分。我們不會嘗試比對具有指數的數字,例如 1.5e8(科學記號中的 1.5 億)。

乍看之下,下列正規表示式似乎可以達到目的:[-+]?[0-9]*\.?[0-9]*。這將浮點數定義為一個 可選 符號,後接一個 系列 數字(整數部分)的 可選 項目,後接一個可選的句點,後接另一個可選的數字系列(小數部分)。

將正規表示式用文字拼出來會很明顯:此正規表示式中的所有內容都是可選的。此正規表示式將符號本身或點本身視為有效的浮點數。事實上,它甚至將空字串視為有效的浮點數。如果你嘗試使用此正規表示式在檔案中尋找浮點數,你會在字串中沒有浮點數出現的每個位置取得零長度比對

未跳脫也是常見的錯誤。未跳脫的點會比對任何字元,包括點。如果我們沒有跳脫點,4.44X4 都會被視為浮點數。

在建立正規表示式時,考量它不應該比對什麼比它應該比對什麼更重要。上述正規表示式確實比對正確的浮點數,因為正規表示式引擎是貪婪的。但它也比對許多我們不想要的內容,我們必須排除這些內容。

以下是更好的嘗試:[-+]?([0-9]*\.[0-9]+|[0-9]+)。此正規表示式比對可選符號,即不是後接零個或多個數字,後接一個點和一個或多個數字(浮點數,可選整數部分),就是後接一個或多個數字(整數)。

這是更好的定義。任何比對都必須包含至少一個數字。沒有辦法繞過[0-9]+部分。我們已成功排除我們不想要的比對:沒有數字的比對。

我們可以最佳化此正規表示式為:[-+]?[0-9]*\.?[0-9]+

如果你也想比對帶有指數的數字,你可以使用:[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?。請注意,我如何透過群組,而不是讓指數中的每個元素可選,讓整個指數部分可選。

最後,如果你想驗證特定字串是否包含浮點數,而不是在較長的文字中尋找浮點數,你必須錨定你的正規表示式:^[-+]?[0-9]*\.?[0-9]+$^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$。你可以在 RegexBuddy 的程式庫 中找到這些正規表示式的其他變形。