1.正则表达式的基本语法
1.1两个特殊符号 ‘^’ 和 ‘$’
^ 正则表达式的起始符
^tom 表示所有以tom开头的字符串
$ 正则表达式的结束符
lucy$ 表示所有以lucy结束的字符串
^$ 结合使用
^tom$ 表示以tom开头,并以tom结束的字符串,只有tom本身
不使用 ^$
tom 表示任何包含 tom 的字符串
1.2 出现次数的表示符号 * + ?
* 表示出现 0次 或者 至少1次
+ 表示出现 至少1次
? 表示出现 0次 或者 1次
^abc*$ 表示 c 可能出现0次或者至少1次, ab必须出现1次
^bcd+$ 表示 d 至少出现1次,bc必须出现1次
^cba?$ 表示 a 可能出现0次或者1次,cb必须出现1次
^(abc)+$ 表示 abc 这个整体至少出现1次
^[abc]+$ 表示 abc 中任意一个字符,至少出现1次
^ab+c$ 表示 a 必须出现1次 ,b至少出现1次 ,c必须出现1次
1.3 指定出现次数的范围 {}
使用{m,n} 表示出现次数的范围
m–至少出现m次
n–最多出现n次
举例如下
| 1 2 3 |
|
- {m,n} 可以不指定n的值,但是一定要指定m的值
- {k} 只有一个值 k ,表示出现的是固定的次数
1.4 “或” 操作 |
^ab|cd$ -- 表示匹配结果是 ab 或 cd 其中一个
^(bc|df)a$ -- 表示匹配结果是 bca 或 dfa
^(ab|c)*d$ -- 表示匹配结果是 以 ab 开头或者 c 开头,中间任意字符,以d结尾
1.5 替代任意字符的 . 英文句号
^ab.[0-9]$ -- 表示ab开头,中间任意1个字符后面是0-9任意一个数字
^[a-z].{3}$ -- 表示a-z中任意一个小写字母,后面跟三个任意字符
1.6 方括号的使用 []
[] 方括号表示某些字符允许在一个字符串中某一个特定位置出现
^[ab]$ 表示一个字符串中有一个a 或 b <===> ^a|b$
^[a-d]$ 表示一个字符串包含小写 abcdb 中的一个 <==>^[abcd]$<==>^a|b|c$
^[0-9]a$ 表示0-9中任意一个数字后面跟一个小写字母a
^[a-z]{2}$ 表示a-z中任意的字符串总共出现3个
^[A-Z]+$ 表示A-Z中任意一个大写字母至少出现1次
方括号[]中使用 ^ ,表示不希望出现字符,简称过滤字符,而且 ^ 必须用在[]中的第一位
^a[^0-9]%$ 表示 a 和 % 中间不能出现数字
1.7 小括号 () 的作用
1.7.1 限定量词作用的范围
1.7.2 分支结构
^abc(123|bb)+$ abc 后面跟着 (123|bb)+
^abc123|bb+$ abc123 或者 bb+
1.7.3 引用分组
这是括号一个重要的作用,有了它,我们就可以进行数据提取,以及更强大的替换操作。
而要使用它带来的好处,必须配合使用实现环境的API。
以日期为例。假设格式是yyyy-mm-dd的,我们可以先写一个简单的正则:
| 1 2 3 |
|
1.7.4提取数据
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1.7.5替换
比如,想把yyyy-mm-dd格式,替换成mm/dd/yyyy怎么做?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1.7.6反向引用
- 除了使用相应API来引用分组,也可以在正则本身里引用分组。但只能引用之前出现的分组,即反向引用。
还是以日期为例。
比如要写一个正则支持匹配如下三种格式:
2016-06-12
2016/06/12
2016.06.12
最先可能想到的正则是:
| 1 2 3 4 5 6 7 8 9 |
|
其中/和.需要转义。虽然匹配了要求的情况,但也匹配"2016-06/12"这样的数据。
假设我们想要求分割符前后一致怎么办?此时需要使用反向引用:
| 1 2 3 4 5 6 7 8 9 |
|
注意里面的\1,表示的引用之前的那个分组(-|/|.)。不管它匹配到什么(比如-),\1都匹配那个同样的具体某个字符。
我们知道了\1的含义后,那么\2和\3的概念也就理解了,即分别指代第二个和第三个分组。
看到这里,此时,恐怕你会有三个问题。
括号嵌套怎么办?
以左括号(开括号)为准。比如:
| 1 2 3 4 5 6 7 |
|
我们可以看看这个正则匹配模式:
第一个字符是数字,比如说1,
第二个字符是数字,比如说2,
第三个字符是数字,比如说3,
接下来的是\1,是第一个分组内容,那么看第一个开括号对应的分组是什么,是123,
接下来的是\2,找到第2个开括号,对应的分组,匹配的内容是1,
接下来的是\3,找到第3个开括号,对应的分组,匹配的内容是23,
最后的是\4,找到第3个开括号,对应的分组,匹配的内容是3。
这个问题,估计仔细看一下,就该明白了。
\10表示什么呢?
另外一个疑问可能是,即\10是表示第10个分组,还是\1和0呢?答案是前者,虽然一个正则里出现\10比较罕见。测试如下:
| 1 2 3 |
|
引用不存在的分组会怎样?
因为反向引用,是引用前面的分组,但我们在正则里引用了不存在的分组时,此时正则不会报错,只是匹配反向引用的字符本身。例如\2,就匹配"\2"。注意"\2"表示对2进行了转意。
| 1 2 3 |
|
chrome浏览器打印的结果:
1.7.7非捕获分组
之前文中出现的分组,都会捕获它们匹配到的数据,以便后续引用,因此也称他们是捕获型分组。
如果只想要括号最原始的功能,但不会引用它,即,既不在API里引用,也不在正则里反向引用。此时可以使用非捕获分组(?:p),例如本文第一个例子可以修改为:
| 1 2 3 |
|
1.7.8 操作实例
字符串trim方法模拟
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
将每个单词的首字母转换为大写
| 1 2 3 4 5 6 7 |
|
驼峰化
| 1 2 3 4 5 6 7 |
|
中划线化
| 1 2 3 4 5 |
|
html转义和反转义
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
匹配成对标签
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
2. 常用的正则表达式
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/57468.html