繁体   English   中英

如何减少正则表达式的复杂性?

[英]how to reduce complexity in regex?

我有一个正则表达式 ,可以找到用美元表示的所有种类的钱,例如$ 290,USD240,$ 234.45,234.5 $,234.6usd

(\$)[0-9]+\.?([0-9]*)|usd+[0-9]+\.?([0-9]*)|[0-9]+\.?[0-9]*usd|[0-9]+\.?[0-9]*(\$)

这似乎可行,但是如何避免正则表达式的复杂性?

通过折叠货币指标,可以使正则表达式短一些:
您可以说USD$ 金额而不是USD 金额$ 金额 这将导致以下正则表达式:

((\$|usd)[0-9]+\.?([0-9]*))|([0-9]+\.?[0-9]*(\$|usd))

我不确定是否会发现它不太复杂,但至少它更容易阅读,因为它更短

字符集[0-9]也可以替换为\\d (与任何数字匹配的字符类),从而使正则表达式更短。
这样做,正则表达式将如下所示:

((\$|usd)\d+\.?\d*)|(\d+\.?\d*(\$|usd))

更新:

  • 根据@Toto的说法,使用非捕获组(例如,删除了@SimonMᶜKenzie指出的不必要的捕获组),此正则表达式的性能会更高:

     (?:\\$|usd)\\d+\\.?\\d*|\\d+\\.?\\d*(?:\\$|usd) 
  • $.0类的金额与@Gangnus指出的正则表达式不匹配。 我更新了正则表达式来解决此问题:

     ((\\$|usd)((\\d+\\.?\\d*)|(\\.\\d+)))|(((\\d+\\.?\\d*)|(\\.\\d+))(\\$|usd)) 

    请注意,我将\\d+\\.?\\d*更改为((\\d+\\.?\\d*)|(\\.\\d+)) :现在,它匹配一个或多个数字,可以选择匹配一个或多个数字,然后可以跟一个点零个或多个数字; 或一个点后跟一个或多个数字。

    没有不必要的捕获组和不使用捕获组:

     (?:\\$|usd)(?:\\d+\\.?\\d*|\\.\\d+)|(?:\\d+\\.?\\d*|\\.\\d+)(?:\\$|usd) 

试试这个

^(?:\\$|usd)?(?:\\d+\\.?\\d*)(?:\\$|usd)?$

降低复杂度将降低正确性。 以下正则表达式可以正常运行,但即使不使用小写字母也是如此。 (但是可以通过密钥来管理)。 此处所有其他当前答案根本没有十进制数字的正确子字符串。

^\s*(?:(?:(?:-?(?:usd|\$)|(?:usd|\$)-)(?:(?:0|[1-9]\d*)?(?:\.\d+)?(?<=\d)))|(?:-?(?:(?:0|[1-9]\d*)?(?:\.\d+)?(?<=\d))(?:usd|\$)))\s*$

在这里查看测试结果。

画一条正确的线,然后再尝试缩短它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM