<p>Google在<a href="http://www.google.com/search?q=scientific+notation+regexp" rel="noreferrer">"scientific notation regexp"</a>上显示了许多匹配项,包括<a href="http://www.regular-expressions.info/floatingpoint.html" rel="noreferrer">this one</a>(<strong>不要使用它!!!!</strong>)使用</p>
<pre><code>*** warning: questionable ***
/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/
</code></pre>
<p>其中包括-.5e7和+00000e33(这两种情况您可能都不允许)。</p>
<p>相反,我强烈建议您使用Doug Crockford的<a href="http://www.json.org/" rel="noreferrer">JSON website</a>语法,它显式地记录了JSON中数字的构成。下面是从该页获取的相应语法图:</p>
<p><a href="https://i.stack.imgur.com/IBQke.gif" rel="noreferrer"><img src="https://i.stack.imgur.com/IBQke.gif" alt="alt text"/></a><br/>
<sub>(来源:<a href="http://www.json.org/number.gif" rel="noreferrer">json.org</a>)</sub></p>
<p>如果您查看他的<a href="https://github.com/douglascrockford/JSON-js/blob/master/json2.js" rel="noreferrer">json2.js</a>脚本的第456行(在javascript中安全地转换为JSON或从JSON转换为JSON),您将看到regexp的这一部分:</p>
<pre><code>/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
</code></pre>
<p>讽刺的是,这和他的语法图不匹配。。。。(看起来我应该提交一个bug)我相信实现该语法图的regexp是这样的:</p>
<pre><code>/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
</code></pre>
<p>如果你也想要一个初始的+值,你会得到:</p>
<pre><code>/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/
</code></pre>
<p>根据您的喜好添加捕获括号。</p>
<p>我还强烈建议您充实一堆测试用例,以确保您包括那些您希望包括(或不包括)的可能性,例如:</p>
<pre><code>allowed:
+3
3.2e23
-4.70e+9
-.2E-4
-7.6603
not allowed:
+0003 (leading zeros)
37.e88 (dot before the e)
</code></pre>
<p>祝你好运!</p>