如何同时匹配字符串中的整数和浮点数

简介: 如何同时匹配字符串中的整数和浮点数

如何同时匹配字符串中的整数和浮点数

首先,明白几个边界匹配器字符的含义。

^:整行字符串的开头位置

\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、 125678。这些并不是我们想要的结果。


那我们是不是能把这几个特殊的去除掉呢?后来又想到一种匹配规则:[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、先找出非数字和小数点的东西,替换掉,接着找整数和带小数的整数

目录
相关文章
|
1月前
|
编译器 C语言
关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断
关于合法浮点数、转义字符、八进制、十六进制、字符常量的判断
31 0
|
1月前
|
C语言
Day6 不要二、把字符串转换成整数
Day6 不要二、把字符串转换成整数
32 0
|
1月前
|
算法
实现一个标准数字字符串四舍五入截取不指定位数的小数
实现一个标准数字字符串四舍五入截取不指定位数的小数
25 0
|
1月前
|
存储
【字符串】13. 罗马数字转整数
【字符串】13. 罗马数字转整数
|
1月前
|
C++
(C++)字符串相加
(C++)字符串相加
52 0
|
1月前
|
存储 C++
(C++)把字符串转换成整数
(C++)把字符串转换成整数
35 0
|
C语言
整数和浮点数的任意进制转!!(包括16进制)确定不进来看看?!
整数和浮点数的任意进制转!!(包括16进制)确定不进来看看?!
115 0
|
C语言
已知一个整数,如何判断这个整数是无符号的?
已知一个整数,如何判断这个整数是无符号的?
71 0
|
C++
C++ 整数转字符串
C++ 整数转字符串
81 0
|
JavaScript 前端开发
数字和字符串相加
数字和字符串相加
105 0