我有 正则表达式 ,它会找到以美元表示的所有款项,例如 $ 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]*(\$)
这似乎有效,但我怎样才能避免我的正则表达式的复杂性?
答案 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。
制作正确的一行,然后才尝试缩短它。