我有这个正则表达式:
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);
答案 0 :(得分:2)
您可以通过将正则表达式修改为:
来解决此问题^-?[0-9]{1,3}(?: [0-9]{3})*(?:\.[0-9]{0,2})?$
在字符类之前,不要将字符类中的空格和DOT保持匹配。
答案 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
,它将返回-190
,254
和254.22
。有关完整测试,请参阅this regex101。