正则表达式匹配数值类型字符串

2018-12-29 08:44:28 +08:00
 jarry118

求表达式匹配 int 类型、float 类型,比如匹配 0、1.0、2,0.0000、123.345, 不匹配时间格式 2018-12-29、版本号 2.3.4。

2693 次点击
所在节点    Python
32 条回复
jarry118
2018-12-29 08:46:42 +08:00
目前用的“[0-9]+\.?[0-9]+?$” ,不能匹配 0、1、2 等个位数的 int 类型。
wersonliu9527
2018-12-29 08:58:06 +08:00
加个 | 匹配个位数规则?
jinhan13789991
2018-12-29 09:03:23 +08:00
我就问下,版本号 2.3 你怎么和 float 2.3 区分 /dog
bumz
2018-12-29 09:03:32 +08:00
/^([0-9]*\.)?[0-9]+$/

把 [0-9]* 换成 [0-9]+ 可以不匹配 .1, .25 这样的浮点数
yeyu1989
2018-12-29 09:05:37 +08:00
\d+\.{0,1}\d*
geelaw
2018-12-29 09:07:08 +08:00
如果你不考虑范围、只考虑 C99 的字面量、不考虑类型后缀的话:

整数是
(1-9)(0-9)*|0[xX][0-9A-Fa-f]+|0(0-7)*

第一种是十进制,第二种是十六进制,第三种是八进制。

浮点数是

0[xX]([0-9A-Fa-f]+(\.[0-9a-fA-F]*)?|\.[0-9a-fA-F]+)[pP][+-]?[0-9]+|[0-9]+[eE][+-]?[0-9]+|([0-9]+\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?

第一种是十六进制,第二种是十进制没有小数点,第三种是十进制有小数点。

提示:正负号是一元运算,而不是字面量的一部分。
jarry118
2018-12-29 09:07:31 +08:00
@jinhan13789991 你这么一说,我竟无言以对,幸好我只是做 mysql 监控指标采集,mysql 的版本号不会为 2.3 这种的。🙈
goreliu
2018-12-29 09:08:00 +08:00
这个不需要用正则表达式,float("xxx") 没异常就匹配了。
jarry118
2018-12-29 09:08:09 +08:00
@wersonliu9527 是个好方法,已经测试可以,但是我想更简单点。
szq8014
2018-12-29 09:09:11 +08:00
\d+(\.\d+)?

正经脸,是不是也太简单了……你是不是连去网上搜一下正则的教程的时间也没有……
geelaw
2018-12-29 09:09:45 +08:00
@geelaw #6 Oops 整数应该是

[1-9][0-9]*|0[xX][0-9A-Fa-f]+|0[0-7]*
jarry118
2018-12-29 09:11:59 +08:00
@bumz 感谢,这个答案试过了,可以。🎉🎉🎉
jarry118
2018-12-29 09:15:41 +08:00
@geelaw 考虑的很周到,但是您的表达式不能过滤版本号,我这边采集的数据都是十进制的。
Leigg
2018-12-29 09:17:14 +08:00
[^-](\d+([\.\d]\d+)[^-]
jarry118
2018-12-29 09:17:44 +08:00
@szq8014 是实话,我 google 了好多呢,您的表达式不能过滤时间格式,我之前也试过。
jarry118
2018-12-29 09:19:49 +08:00
@yeyu1989 您的也是不能过滤时间格式。🙈🙈🙈
jinhan13789991
2018-12-29 09:22:05 +08:00
(?<![\d\.-])(\d+\.?\d*)(?![\d\.-])
刚刚写的 自测通过~
yeyu1989
2018-12-29 09:24:11 +08:00
@jarry118 时间格式里有三个数字,简单匹配当然能匹配上。这得看你其他限制啊,比如是空格中间的一段值吗还是什么?
jarry118
2018-12-29 09:25:35 +08:00
@goreliu 这确实是个好方式,但是有的值是空字符串,如果强行用 float 的话,值就会变成 0.0,但是值对应的指标类型不为数值类型,所以也不能强制转换,除非再加一层类型判断,这样的话,感觉还是正则方便。
szq8014
2018-12-29 09:25:42 +08:00
@jarry118 嗯,是的,不好意思。那你知道为什么我的答案能匹配日期吗?~ 2333

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/522125

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX