範例 |
正規表示式範例 |
數字範圍 |
浮點數 |
電子郵件地址 |
IP 地址 |
有效的日期 |
數字日期轉換為文字 |
信用卡號碼 |
比對完整行 |
刪除重複行 |
程式設計 |
兩個相近的字詞 |
陷阱 |
災難性的回溯 |
過多重複 |
拒絕服務 |
讓所有內容變成可選 |
重複擷取群組 |
混合 Unicode 和 8 位元 |
此網站的更多資訊 |
簡介 |
正規表示式快速開始 |
正規表示式教學 |
替換字串教學 |
應用程式和語言 |
正規表示式範例 |
正規表示式參考 |
替換字串參考 |
書籍評論 |
可列印 PDF |
關於此網站 |
RSS Feed 和部落格 |
這個範例說明如何避免不熟悉 正規表示式 的人常犯的常見錯誤。例如,我們將嘗試建立一個正規表示式,可以比對任何浮點數。我們的正規表示式也應該比對整數和浮點數,其中未提供整數部分。我們不會嘗試比對具有指數的數字,例如 1.5e8(科學記號中的 1.5 億)。
乍看之下,下列正規表示式似乎可以達到目的:[-+]?[0-9]*\.?[0-9]*。這將浮點數定義為一個 可選 符號,後接一個 系列 數字(整數部分)的 可選 項目,後接一個可選的句點,後接另一個可選的數字系列(小數部分)。
將正規表示式用文字拼出來會很明顯:此正規表示式中的所有內容都是可選的。此正規表示式將符號本身或點本身視為有效的浮點數。事實上,它甚至將空字串視為有效的浮點數。如果你嘗試使用此正規表示式在檔案中尋找浮點數,你會在字串中沒有浮點數出現的每個位置取得零長度比對。
未跳脫點也是常見的錯誤。未跳脫的點會比對任何字元,包括點。如果我們沒有跳脫點,4.4 和 4X4 都會被視為浮點數。
在建立正規表示式時,考量它不應該比對什麼比它應該比對什麼更重要。上述正規表示式確實比對正確的浮點數,因為正規表示式引擎是貪婪的。但它也比對許多我們不想要的內容,我們必須排除這些內容。
以下是更好的嘗試:[-+]?([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 的程式庫 中找到這些正規表示式的其他變形。
| 快速開始 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |
| 正規表示式範例 | 數字範圍 | 浮點數 | 電子郵件地址 | IP 地址 | 有效日期 | 數字日期轉文字 | 信用卡號碼 | 比對完整行 | 刪除重複行 | 程式設計 | 兩個相近的字 |
| 災難性的回溯 | 過多的重複 | 阻斷服務 | 讓所有東西都變成可選 | 重複擷取群組 | 混合 Unicode 和 8 位元 |
頁面網址:https://regular-expressions.dev.org.tw/floatingpoint.html
頁面最後更新時間:2021 年 9 月 2 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。