首先,明白几个边界匹配器字符的含义。
^
:整行字符串的开头位置
\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
,这个问题可以通过在字符串两边各加一个字母解决掉。
暂时爬坑到这里,后续有进展接着更新...
原文地址:https://www.cnblogs.com/tudou1179006580/p/11100155.html
时间: 2024-10-26 07:18:17