擅长:python、mysql、java
<p>正则表达式更棘手的部分不是让它们接受有效的输入,而是让它们拒绝无效的输入。例如,第二个表达式接受明显错误的输入,包括:</p>
<ul>
<li><code>(1,2,3,4</code>——每个逗号之间有一个数字</li>
<li><code>(12,34,56</code>——每个逗号之间有两个数字</li>
<li><code>(1234......5</code>——小数点数目不限</li>
<li><code>(1234,.5</code>——小数点前有逗号</li>
<li><code>(123,456789,012</code>——如果有一些逗号,它们应该在每个三元组之间</li>
<li><code>(01234</code>——前导零不是常规的</li>
<li><code>(123.4X</code>——最后一个字符不是结束符</li>
</ul>
<p>下面是一个替代正则表达式,它应该拒绝上面的示例:</p>
<p><code>[-+]?[$]?(0|[1-9]\d*|[1-9]\d{0,2}(,\d{3})*)(\.\d+)?</code></p>
<ul>
<li>可选前导加号/减号。在</li>
<li>可选美元符号。在</li>
<li>以<code>|</code>分隔的三个选项:
<ul>
<li>一个零位数(对于0.5或简单的0)。在</li>
<li>不带逗号的任意位数。第一个数字不能为零。在</li>
<li>逗号分隔的数字。第一个数字不能为零。第一个逗号前最多三位数字。每个逗号后面必须紧跟三位数字。在</li>
</ul></li>
<li>可选的一个小数点,后面必须跟一个或多个数字。在</li>
</ul>
<p>关于parens,如果您只关心paren是否平衡,那么您可以忽略精确解析出数字格式;只需相信paren之间的任何数字、小数点和逗号的组合都是有效的。然后使用<code>(?!...)</code>构造,如果输入的<em>与内部的正则表达式不匹配,则该构造的计算结果为匹配。在</p>
<p><code>(?!\([$\d.,]+\))</code></p>