3 回答

TA貢獻1809條經驗 獲得超8個贊
谷歌在“科學記譜法regexp”上展示了一些比賽,包括這一場比賽(不要用它!!!!)
*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/
其中包括-.5e7和+ 00000e33等情況(您可能不希望這兩種情況)。
相反,我強烈建議您使用Doug Crockford的JSON網站上的語法,該網站明確記錄了JSON中數字的構成。這是從該頁面獲取的相應語法圖:
如果你查看他的json2.js腳本的第456行(在javascript中安全地轉換為JSON),你會看到正則表達式的這一部分:
/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
具有諷刺意味的是,它與他的語法圖不符....(看起來我應該提交一個bug)我相信實現該語法圖的正則表達式是這樣的:
/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
如果你想允許一個初始+,你會得到:
/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
根據自己的喜好添加捕獲括號。
我還強烈建議您充實一堆測試用例,以確保包含您想要包含(或不包括)的可能性,例如:
allowed:
+3
3.2e23
-4.70e+9
-.2E-4
-7.6603
not allowed:
+0003 (leading zeros)
37.e88 (dot before the e)
祝好運!

TA貢獻1827條經驗 獲得超8個贊
建立最高評級的答案,我稍微修改了正則表達式/^[+\-]?(?=.)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/
。
它提供的好處是:
允許匹配數字
.9
(我做了(?:0|[1-9]\d*)
可選項?
)防止在開始時僅匹配運算符并防止匹配的零長度字符串(使用前瞻性
(?=.)
)防止匹配
e9
因為它需要\d
在科學記數法之前
我的目標是用它來捕獲重要的數字并進行重要的數學運算。因此,我也會將捕捉組切成這樣:/^[+\-]?(?=.)(0|[1-9]\d*)?(\.\d*)?(?:(\d)[eE][+\-]?\d+)?$/
。
解釋如何從中獲得重要數據:
整個捕獲是您可以交付的數字
parseFloat()
匹配1-3將顯示為未定義或字符串,因此組合它們(替換為
undefined
s''
)應該給出可從中提取有效數字的原始數字。
這個正則表達式還可以防止匹配左邊填充的零,JavaScript有時會接受,但我看到它會導致問題并且不會對有效數字產生任何影響,所以我看到防止左邊填充的零作為一個好處(特別是在表單中)。但是,我確信可以修改正則表達式以吞噬左邊填充的零。
我看到這個正則表達式的另一個問題是它不匹配90.e9
或其他這樣的數字。但是,我發(fā)現這種或類似的匹配極不可能,因為科學記數法中的慣例是避免這樣的數字。雖然您可以在JavaScript中輸入它,但您可以輕松輸入9.0e10
并獲得相同的重要數字。
UPDATE
在我的測試中,我也發(fā)現了它可以匹配的錯誤'.'
。因此,應該修改前瞻,(?=\.\d|\d)
以導致最終的正則表達式:
/^[+\-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/

TA貢獻1946條經驗 獲得超4個贊
這是我剛剛快速入侵的一些Perl代碼。
my($sign,$coeffl,$coeffr,$exp) = $str =~ /^\s*([-+])?(\d+)(\.\d*)?e([-+]?\d+)\s*$/;my $shift = length $coeffl;$shift = 0 if $shift == 1;my $coeff = substr( $coeffl, 0, 1 );if( $shift || $coeffr ){ $coeff .= '.'. substr( $coeffl, 1 );}$coeff .= substr( $coeffr, 1 ) if $coeffr;$coeff = $sign . $coeff if $sign;$exp += $shift;say "coeff: $coeff exponent: $exp";
- 3 回答
- 0 關注
- 568 瀏覽
添加回答
舉報