求表达式匹配 int 类型、float 类型,比如匹配 0、1.0、2,0.0000、123.345, 不匹配时间格式 2018-12-29、版本号 2.3.4。
1
jarry118 OP 目前用的“[0-9]+\.?[0-9]+?$” ,不能匹配 0、1、2 等个位数的 int 类型。
|
2
wersonliu9527 2018-12-29 08:58:06 +08:00 1
加个 | 匹配个位数规则?
|
3
jinhan13789991 2018-12-29 09:03:23 +08:00
我就问下,版本号 2.3 你怎么和 float 2.3 区分 /dog
|
4
bumz 2018-12-29 09:03:32 +08:00
/^([0-9]*\.)?[0-9]+$/
把 [0-9]* 换成 [0-9]+ 可以不匹配 .1, .25 这样的浮点数 |
5
yeyu1989 2018-12-29 09:05:37 +08:00
\d+\.{0,1}\d*
|
6
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]+)? 第一种是十六进制,第二种是十进制没有小数点,第三种是十进制有小数点。 提示:正负号是一元运算,而不是字面量的一部分。 |
7
jarry118 OP @jinhan13789991 你这么一说,我竟无言以对,幸好我只是做 mysql 监控指标采集,mysql 的版本号不会为 2.3 这种的。🙈
|
8
goreliu 2018-12-29 09:08:00 +08:00
这个不需要用正则表达式,float("xxx") 没异常就匹配了。
|
9
jarry118 OP @wersonliu9527 是个好方法,已经测试可以,但是我想更简单点。
|
10
szq8014 2018-12-29 09:09:11 +08:00
\d+(\.\d+)?
正经脸,是不是也太简单了……你是不是连去网上搜一下正则的教程的时间也没有…… |
14
Leigg 2018-12-29 09:17:14 +08:00 via iPhone
[^-](\d+([\.\d]\d+)[^-]
|
17
jinhan13789991 2018-12-29 09:22:05 +08:00
(?<![\d\.-])(\d+\.?\d*)(?![\d\.-])
刚刚写的 自测通过~ |
19
jarry118 OP @goreliu 这确实是个好方式,但是有的值是空字符串,如果强行用 float 的话,值就会变成 0.0,但是值对应的指标类型不为数值类型,所以也不能强制转换,除非再加一层类型判断,这样的话,感觉还是正则方便。
|
21
goreliu 2018-12-29 09:29:02 +08:00
@jarry118
>>> float("") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: could not convert string to float: |
22
jinhan13789991 2018-12-29 09:41:41 +08:00
@jarry118 #12 这个答案是必须数字开头结尾的啊~
|
23
bzw875 2018-12-29 09:50:51 +08:00 1
|
28
jarry118 OP @jinhan13789991 是的呢
|
29
geelaw 2018-12-29 11:02:29 +08:00
|
30
xpresslink 2018-12-29 14:46:38 +08:00
不知道楼主是想要学习正则表达式呢,还是要满足需求?
实际上根本用不着正则。 >>> text = "比如匹配 0、1.0、2,0.0000、123.345, 不匹配时间格式 2018-12-29、版本号 2.3.4。" >>> [ ''.join(g) for k,g in itertools.groupby(text, lambda x: x in '0123456789.-:') if k] ['0', '1.0', '2', '0.0000', '123.345', '2018-12-29', '2.3.4'] >>> list(filter(lambda y: ('-' not in y) and (y.count('.') < 2), ['0', '1.0', '2', '0.0000', '123.345', '2018-12-29', '2.3.4'])) ['0', '1.0', '2', '0.0000', '123.345'] >>> |
31
jinhan13789991 2018-12-29 17:24:39 +08:00
![cmd-markdown-logo]( http://35.220.239.255:8080/uploads/big/47fa4fd2e562a111acd32f512487e3e4.png)
测试下图床,今天很想贴图片,但是没有图床,自己搭建了一个~ |
32
Vegetable 2018-12-29 17:28:10 +08:00
\d+(?:\.\d+)*
|