Lir*_*nBo 6 regex decimal comma
我在寻找包含逗号分隔符的十进制数的正确正则表达式时遇到了麻烦.
我确实在一般情况下找到了一些关于这个问题的其他问题,但是当我测试它们时,没有一个答案真的起作用
到目前为止我得到的最好的是:
[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)?
Run Code Online (Sandbox Code Playgroud)
到目前为止2个主要问题:
1)它记录数字之间的空格"3001 1"而不是将它们分成2个匹配"3001""1" - 我真的没有看到我在正则表达式中允许空格的位置.
2)我对正则表达式的开头\结尾有一个普遍的问题.
正则表达式应匹配:
3,001
1
32,012,111.2131
Run Code Online (Sandbox Code Playgroud)
但不是:
32,012,11.2131
1132,012,111.2131
32,0112,111.2131
32131
Run Code Online (Sandbox Code Playgroud)
另外我想要匹配:
1.(without any number after it)
1,(without any number after it)
as 1
Run Code Online (Sandbox Code Playgroud)
(应忽略数字末尾的逗号或点).
非常感谢!.
这是一个非常长且复杂的正则表达式,可以满足您的所有要求。如果您的正则表达式引擎基于 PCRE(希望您使用的是 PHP、Delphi 或 R..),它将起作用。
(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$))
Run Code Online (Sandbox Code Playgroud)
使它如此漫长的事情:
.或,不包含.或,结尾的数字需要再次前瞻。(?=[,.](\s|$)) 解释
在编写此解释时,我意识到\s需要在字符串的末尾(\s|$)进行匹配。1,
正则表达式的这一部分用于匹配1in1,或 the 1,000in 1,000.,所以假设我们的数字是1,000.(.末尾带有 )。
到目前为止,正则表达式已经匹配1,000,然后它无法找到另一个,来重复数千组,因此它继续到我们的(?=[,.](\s|$))
(?=....)意味着它是一个前瞻,这意味着从我们匹配的地方开始,看看接下来会发生什么,但不要将其添加到匹配中。
因此,它检查是否存在 a,或 a .,如果存在,则检查它后面是否紧跟着空格或输入结尾。在这种情况下,所以它会将比赛保留为1,000
如果前瞻不匹配,它将继续尝试匹配小数位。