如何同时匹配字符串中的整数和浮点数
首先,明白几个边界匹配器字符的含义。
^
:整行字符串的开头位置
\A
:整段字符串的开头位置
$
:整行字符串的结尾位置
\z
:整段字符串的结尾位置
关于 \b和 \B,官方原版的解释中是A word boundary和A non-word boundary,没有详细的解释,反正我是没看明白,自己测试一下,匹配字符串: 6lo.ve,正则表达式: \B\D。结果共三处,包括 l、 o、 v 三个字母。
那么我们是不是可以认为\B\D表示:匹配一个任意非数字的字符,并且字符的前一位是字母或者数字,此时这个单词不是边界单词; \b\D表示:匹配一个任意非数字的字符,并且字符的前一位不是字母或者数字,此时是一个边界单词。
再来说说数字的匹配,先来一个示例字符串:
"78.64java23.678love98py3.4.5c78c++144vv7vv12..12r45v.56v56."
最简单的正则表达式为:[0-9]+(\.[0-9]+)?
这个可以匹配绝大多数的结果,但是如果字符串中的 3.4.5、 12..12、 .56、 78. 这种数字的,会被匹配出来3.4、 5, 12、 12, 56, 78。这些并不是我们想要的结果。
那我们是不是能把这几个特殊的去除掉呢?后来又想到一种匹配规则:[0-9]+\.{0,1}[0-9]+\.{0}[0-9]
你有没有发现这个匹配是有点问题的:
- 第一个
.
前面的数字是一个或者多个,后面的数字也是一个或者多个; - 第二个
.
后面的数字是一位,也就是说。
也就是说,这个规则匹配到的数字至少是三位整数,如果带有小数的话,至少要带有两位小数(整数位至少也要保证一个位数)
假设字符串里面除了字母、数字和小数点不再包含别的东西,那么我们是不是可以试试另外一种匹配模式:\B[0-9]+\.{0,1}[0-9]+\B
这个匹配中, \B 表示数字旁边的必定是一个单词(即数字或者字母),这样就可以排除掉 3.4.5、 12..12、 .56、 56.这种类型的数字,但是这个也有一些缺点:
- 字符串只包含字母、数字和小数点;
- 匹配的数字是从两位起步的;
- 字符串的开头和结尾不能为数字,不然会被舍弃掉,例如上述字符串中 78.64会变成 8.64,这个问题可以通过在字符串两边各加一个字母解决掉。
暂时爬坑到这里,接着提供两种思路:
1、是先匹配出里面的整数或者小数,再进行筛选,做两次正则匹配;
2、先找出非数字和小数点的东西,替换掉,接着找整数和带小数的整数