繁体   English   中英

正则表达式以匹配金额

[英]Regular Expression to match amounts

我有这个正则表达式:

^-?([0-9]{1,3})+([ 0-9]{3})*([\.0-9]{2})?$

格式应标记为有效:

190 254 254
10 254 254
1 254 982
250 254
10 254
1 154
190 254 254.22
10 254 254.22
1 254 982.22
250 254.22
10 254.22
1 154.22
-190 254 254
-10 254 254
-1 254 982
-250 254
-10 254
-1 154
-190 254 254.22
-10 254 254.22
-1 254 982.22
-250 254.22
-10 254.22
-1 154.22

但经过我测试了它在这里我只拿到了部分匹配。

更新:在@anubhava先生更正正则表达式后,QLineEdit现在也接受其他格式:

4654d654
55d54
444444

这些是我验证输入的方式:

QRegExp rx("^-?[0-9]{1,3}(?: [0-9]{3})*(?:\.[0-9]{0,2})?$");
QValidator *currencyValidator = new QRegExpValidator(rx, this);
ui->unitPrice->setValidator(currencyValidator);

事实证明,我没有逃避反斜杠:

QRegExp rx("^-?[0-9]{1,3}(?: [0-9]{3})*(?:\\.[0-9]{0,2})?$");
                                          ^

你可以通过修改你的正则表达式来修复它:

^-?[0-9]{1,3}(?: [0-9]{3})*(?:\.[0-9]{0,2})?$

而不是在字符类中保持空格和DOT在字符类之前匹配它们。

更新了正则表达式演示

此段([0-9]{1,3})+表示:

(        Start of capturing group
  [0-9]    Match digit
  {1,3}    Match 1-3 of previous (digit)
)        End of capturing group
+        Match 1 or more of previous (capturing group)

结果是它将匹配1位或更多位数,捕获最后1-3位数字。

由于{1,3}是贪婪的,所以它更喜欢匹配3,因此对于输入12345678 ,这意味着:

123   First repetition of capturing group
456   Second repetition of capturing group
78    Third repetition of capturing group

而且由于实际上只捕获了组的最后一次重复,因此得到78 ,这不是你想要的。 有关详细信息,请参阅此regex101

这只是你的正则表达式的三个部分中的第一部分。 所有三个段都混合{n,m}+* +只是{1,}简写, *{0,}?简写? {0,1}简写。
所以, x{1,3}+实际上意味着x{1,3}{1,} ,这没有任何意义,所以停止加倍重复。


那么,你的正则表达式应该是什么? 可能是这样的:

(-?[0-9]{1,3})(?: ([0-9]{3}))? ([0-9]{3}(?:\.[0-9]{2})?)

对于输入-190 254 254.22 ,将返回-190254 ,和254.22 请参阅此regex101以进行完整测试。

暂无
暂无

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

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