介绍
一般用于文本的复杂处理,通过定义的规则可以匹配一类的字符串。学习它实际就是学它的语法规则。
优势与用途
一种强大而灵活的文本处理工具
大部分编程语言/数据库/文本编辑器/开发环境都支持正则
语法
普通字符
字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。在匹配一个字符串的时候,匹配与之相同的一个字符。
转义字符
\n 换行
\t 制表符
\\ \ 本身
\^,\$,\(,\),\{,\},\?,\+,\*,\|,\[,\] 这些字符本身
标准字符集合
\d 任意一个数字
\w 任意一个字母或数字或下划线
\s 包括空格/制表符/换行符等空白字符的其中任意一个
. 小数点可以匹配任意一个字符(除了换行符)
注意大小写,大写是相反的意思
自定义字符集合
使用 [] 匹配方式,能够匹配方括号中任意一个字符
[ab5@] 匹配a 或 b 或 5 或@
[^abc] 匹配a,b,c以外的字符
[f-k] 匹配f到k之间任意一个字符
[^A-F0-3] 匹配A-F,0-3之外的任意一个字符
量词
{n} 表达式重复n次
{m,n} 表达式至少重复m次,最多重复n次
{m,} 表达式至少重复m次
? 表达式0或者1次
+ 表达式至少出现一次
* 表达式出现任意次(包括0)
匹配次数中贪婪模式(默认)
匹配次数中非贪婪模式 修饰匹配次数的特殊符号后再加上“?”号
字符边界
匹配的不是字符而是位置,符合某种条件的位置
^ 与字符串开始的地方匹配
$ 与字符串结束的地方匹配
\b 匹配一个单词边界
\b:前面的字符和后面的字符不全是\w
注意:整个文本看作一个字符串,都有开头和结尾
如果只匹配开始和结束,可以使用 \A和\Z
选择符和分组
| 左右两边表达式或的关系
() 被修饰匹配次数,内部表达式作为整体
去匹配结果时,内部表达式匹配的内容可以单独拿到
每对括号分配一个编号,顺序从1开始自动编号(以左括号为主)
(?:Expression) 用非捕获组来抵消使用()的副作用
反向引用(\nnn):
通过反向引用,可以对分组已捕获的字符串进行引用
预搜索
-
只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度
-
这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对位置的匹配
-
正则表达式的匹配过程中,如果子表达式匹配的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的,占有字符还是零宽度,是针对匹配内容是否保存到最终匹配结果中而言的
(?=+exp) 断言自身出现的位置的前后能匹配表达式exp
(?<=exp) 断言自身出现的位置的前面能匹配表达式exp
(?!exp) 断言此位置的后面不能匹配表达式exp
(?<!exp) 断言此位置的前面不能匹配表达式exp
常用的正则表达式
使用
环境使用
node++、Esclipse等工具中,在搜索工具中可以选择正则搜索,然后填写正则表达式
编程语言使用
java
相关类位于 java.util.regex包下面
类 Pattern
- 正则表达式的编译表示形式
- Pattern p= Pattern.compile(r,int) //建立正则表达式,并启用相应模式
类 Matcher
-
通过解释Pattern对字符串执行匹配操作的引擎
-
Matcher m = p.matcher(str); //匹配str(字符串)
Pattern p= Pattern.compile("\w+") \java中\要转义一下
Matcher m = p.matcher(“dsfsdf15&&dfds”);
m.matches(); //将整个字符串序列与该模式匹配
m.find() //扫描输入序列,查找下一个与该模式匹配的子序列
m.group() //扫描输入序列,获取下一个与该模式匹配的子序列
注意:在Java中split()中也可以使用正则
爬虫使用案例