通过几个小例子,来说明一下如何理解正则表达式。
例1、比如有下面的需求:
1、Number can start with +, - or . symbol.
Example:
✔+4.50
✔-1.0
✔.5
✔-.7
✔+.4
✖ -+4.5
2、Number must contain at least decimal value.
For example:
✖ 12.
✔12.0
3、Number must have exactly one . symbol.
以上需求(实际上就是判断一个字符串是不是Float类型)的正则表达式为:
^[-+]?[0-9]*\.[0-9]+$
解释:
^ 表示匹配字符串的开始位置
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]。
? 表示匹配零次或一次
到这为止,^[-+]?表示字符串要以一个加号或减号为开头,或者没有加减号也可以。
这里?的作用,是可以没有[+-],如果有只能有一个[+-]。
接着往下,[0-9]*
* 表示匹配 零次到多次
也就是说只能是0-9的数字,可以是0个,1个或多个
接下来的\.
由于 . 在正则表达式中有特殊含义(. 表示匹配单个字符),
所以,如果想精确匹配 . 的话,点前面需要加上转义字符\
最后的[0-9]+$
+ 表示匹配 一次到多次 (至少有一次)
$ 表示匹配字符串的结束位置
也就是说,小数点后面必须至少有一个数字,也可以是多个数字,并且以这些数字结束($的作用)。
例2、匹配字符串中重复的数字或者字母(重复的可以是2个以上的字符),
如下面字符串中的红色字符,是我们要抽出的结果。
..1234567891011121314SSome__Randd1718202122223
正则表达式为:([a-zA-Z0-9])\1+
解释:
( ) 小括号表示匹配括号中全部字符,并且把匹配的字符生成数组
\1 表示2个重复的字符,+ 表示可以是多个重复的字符
注意,为什么不能用\w呢? 因为\w通常表示英文字母或数字或下划线"_"
如果用\w,就会把示例中的"__"也给匹配出来。
但是你是可以把上面的0-9换成\d的。(\d 表示数字 \D 非数字)
例3,再找一个{}使用的例子,比如取得指定字符串中连续两个以上元音字母。
rabcdeefgyYhFjkIoomnpOeorteeeeet
结果应该为:
ee
Ioo
Oeo
eeeee
正则表达式:([aeiouAEIOU]{2,})
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
更多的正则表达式的用法和用例,可以参考:
https://www.cnblogs.com/mzmy/p/11201377.html
https://www.jianshu.com/p/9c4979a3b7e4 ->介绍了?: ?= ?! ?<= ?<!的用法