正则表达式以匹配金额

时间:2016-02-20 10:37:51

标签: c++ regex qt5

我有这个正则表达式:

frame = '\x0f\x02\x0e\x02\xf7\xf7T\xffT\xff'
bits = [0, 0, 1, 1, 0]

# Embedding
frame_bytes = bytearray(frame)
for i, bit in enumerate(bits):
    frame_bytes[i] = (frame_bytes[i] & 254) | bit
frame_modified = bytes(frame_bytes)

# Extraction
frame_bytes = bytearray(frame_modified)
extracted = [frame_bytes[i] & 1 for i in range(5)]
assert bits == extracted

格式应标记为有效:

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

但在我测试here后,我只得到了部分匹配。

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

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

这是我验证输入的方式:

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);

2 个答案:

答案 0 :(得分:2)

您可以通过将正则表达式修改为:

来解决此问题
^-?[0-9]{1,3}(?: [0-9]{3})*(?:\.[0-9]{0,2})?$

在字符类之前,不要将字符类中的空格和DOT保持匹配。

Updated Regex Demo

答案 1 :(得分:1)

此细分([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,这不是您想要的。有关详细信息,请参阅this 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,它将返回-190254254.22。有关完整测试,请参阅this regex101