簡體   English   中英

TCL的TCL regexp浮點數失敗

[英]TCL regexp for float fails at single digit

我開發了以下正則表達式來捕獲浮點數。

([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)

它適用於4.08955e-113.57類的東西。 現在,我的解析器偶然遇到0 ,但失敗了。 我想我需要將所有在小數點后的內容都設為可選。 但是我該怎么做呢?

與人們可能想到的相反,將所有可能的浮點數形式(包括NaN等)與可管理的正則表達式進行匹配,而該正則表達式仍會丟棄例如不可能的大數或偽八進制數,這並非易事。

有一些想法可以通過使用單詞邊界來降低誤報的風險,但請注意,這些匹配單詞字符之間的邊界(通常是字母數字和下划線)。

scan命令允許簡單可靠地驗證和提取浮點數:

scan $number %f

也許使用替代方法:

{[-+]?(?:\y[0-9]+(?:\.[0-9]*)?|\.[0-9]+\y)(?:[eE][-+]?[0-9]+\y)?}

如果將小數點后的所有內容設為可選 (其本身是可選的),則可以匹配2.2.

請注意,您的正則表達式不匹配一位數字,因為您匹配2倍一位或多位數字[0-9]+

如果只想匹配浮點數或零,則可以使用交替形式,例如使用單詞邊界\\b

\\b[-+]?(?:[0-9]+\\.[0-9]+(?:[eE][-+]?[0-9]+)?|0)\\b

說明

  • [-+]? 匹配可選的+或-
  • \\b字邊界
  • (?:非捕獲組
    • [0-9]+\\.[0-9]+匹配一個或多個數字點和一個或多個數字
    • (?:[eE][-+]?[0-9]+)? 可選指數部分
    • | 要么
    • 0字面上匹配
  • )關閉非捕獲組
  • \\b字邊界

要匹配不以點開頭並且可以是一個或多個不帶點的數字的浮點值,請冷使用:

^[-+]?[0-9]+(?:\\.[0-9]+)?(?:[eE][-+]?[0-9]+)?$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM