[英]TCL regexp for float fails at single digit
我開發了以下正則表達式來捕獲浮點數。
([+-]?[0-9]+\.?[0-9]+([eE][-+]?[0-9]+)?)
它適用於4.08955e-11
或3.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
字邊界 要匹配不以點開頭並且可以是一個或多個不帶點的數字的浮點值,請冷使用:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.