如何降低正则表达式的复杂性?

时间:2017-07-26 09:23:40

标签: javascript 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]*(\$)

这似乎有效,但我怎样才能避免我的正则表达式的复杂性?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

更新

  • 根据@Toto,这个正则表达式使用非捕获组会更高效(也删除了@Simon Mᶜ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)
    

答案 1 :(得分:1)

尝试this

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

答案 2 :(得分:0)

降低复杂性会降低正确性。以下正则表达式正常工作,但即使它不小写。 (但这可以通过密钥管理)。这里所有其他当前答案根本没有十进制数的正确子字符串。

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

在测试结果中查看here

制作正确的一行,然后才尝试缩短它。