[英]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
,将返回-190
, 254
,和254.22
。 请参阅此regex101以进行完整测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.