其实百度百科上的正则表达式已经很详细了。
正则表达式的要点在于匹配和等价
下面内容引用自百度百科,基本的等价条件:
> ?等价于匹配长度{0,1}
*等价于匹配长度{0,}
+等价于匹配长度{1,}
\d等价于[0-9]
\D等价于[^0-9]
\w等价于[A-Za-z_0-9]
\W等价于[^A-Za-z_0-9]。
常用运算符与表达式:
^ 开始
() 域段
[] 包含,默认是一个字符长度
[^] 不包含,默认是一个字符长度
{n,m} 匹配长度
. 任何单个字符(\. 字符点)
| 或
\ 转义
$ 结尾
[A-Z] 26个大写字母
[a-z] 26个小写字母
[0-9] 0至9数字
[A-Za-z0-9] 26个大写字母、26个小写字母和0至9数字
, 分割
.
分割语法:
[A,H,T,W] 包含A或H或T或W字母
[a,h,t,w] 包含a或h或t或w字母
[0,3,6,8] 包含0或3或6或8数字
语法与释义:
基础语法 "^([]{})([]{})([]{})$"
正则字符串 = "开始([包含内容]{长度})([包含内容]{长度})([包含内容]{长度})结束"
?,*,+,\d,\w 这些都是简写的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)这种特殊组合情况下除外。
示例一:
All strings of lowercase letters that begin and end in a(以a开头和结尾的所有小写字母字符串。).
a+([a-z]*) a+
题目分析
题目要求字符串全部小写,同时以a开头a结尾,那么首尾必须有a出现,这里我们用a+表示
+是一个限定符,代表至少出现一次。
要表达所有字符串,则必须出现+或*,这是无上限的限定符,小写字母用[a-z]表示。
字符串可能是aa,中间不一定有别的字符串,所以确定[a-z]后面是*而不是+,*代表0次及以上
示例二:
All strings of digits that contain no leading zeros(不包含前导零的所有数字字符串)
什么是leading zeros(前导零):前导零 是一种 显示数字前面的0的一种格式。
比如 我们要求是 999,999.999的格式显示数字
但是如果没有 这么大的数字 会显示 222.340 因为约束了小数点后面的位数,所以没有3位也会显示3位.
但是前面可能没有这么多位数 就不会显示了
而前导零就是要显示出前面的
题目分析
要求没有前导零,即如果一个数的整数部分不为0,那么它的整数部分第一位不能为0
首先考虑整数字符串
[1-9][0-9]*
再考虑到可能有小数
[1-9][0-9]*(\.)?[0-9]*
再考虑到可能有正负
(+|-)?[1-9][0-9]*(\.)?[0-9]*
示例三:
All strings of digits such that all the 2’s occur before all the 9’s(所有的数字串,使所有2出现在所有9之前)
这道题思路和前面的类似,关键在于2必须在9之前
把数字分为不包含2[0|1|3|4|5|6|7|8|9],不包含9[0|1|2|3|4|5|6|7|8|9]以及
太复杂的情况下可以定义变量
nat1 = [0|1|3|4|5|6|7|8|9]
nat2 = [0|1|2|3|4|5|6|7|8]
由于2必须在9之前,那么nat1放最后,nat2放前面即可
nat2+nat1+