正则表达式
定义:描述了一个规则,通过这个规则可以匹配一类字符串,需要学习正则表达式的语法规则
用途:文本的复杂处理
优势:一种强大而灵活的文本处理工具,大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式
开发中使用正则的流程
- 分析所要匹配的数据,写出测试用的典型数据
- 在工具软件中进行匹配测试
- 在程序中调用通过测试的正则表达式
基本语法
- 普通字符:字母、数字、汉字、下划线及没有特殊定义的标点符号。表达式中的普通字符在匹配一字符串的时候,匹配与之相同的一个字符
简单的转义字符:
\n | 换行符 |
---|
\t | 制表符 |
\ | \本身 |
^,$,(,),{,},?,+,*,|,[,] | 这些字符本身 |
- 标准字符集合(大写代表取反)
\d | 任意一个数字,0~9任意一个 |
---|
\w | 字母数字下划线,AZ,az,0~9,_ |
\s | 包含空格、制表符、换行符等空白字符的其中任意一个 |
. | 小数点可以匹配除了换行之外任意一个字符 如果要匹配包括\n在内的任意字符,一般使用[\s\S] |
- 自定义字符集合
- [ ]方括号匹配方式,能够匹配方括号中任意一个字符
[ab5@] | 匹配"a"或者"b"或"5"或"@" |
---|
[^abc] | 匹配a b c 之外任意一个字符(取反) |
[f-k] | 匹配f-k中间任意一个字母 |
[^A-F0-3] | AF,03之外的任意一个字符 |
- 正则表达式的特殊符号被包含到中括号中会失去特殊意义,除了^、-之外
- 标准字符集合,除小数点之外,如果被包含于中括号,自定义字符集和将包含该集合
eg:[\d.-+]将匹配数字,小数点,-,+
- 量词
{n} | 表达式重复n次 eg:\d{6} \d\d{6} (\d\d){6} |
---|
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式最少重复m次 |
? | 匹配表达式0或者1次,相当于{0,1} eg:a\d{0,1}b == a\d?b |
+ | 表达式最少出现m次,相当于{1,} eg:a\d+b |
* | 表达式不出现或者出现任意次,相当于{0,} eg:a\d*b |
- 匹配次数中的贪婪模式(匹配字符越多越好,默认的模式)
- 匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?号)
eg:\d{3,6}?
- 字符边界
- 本组标记匹配的不是字符而是位置(零宽),不匹配字符,而是符合某种条件的位置
^ | 与字符串开始的地方匹配 ^a |
---|
$ | 与字符串结束的地方匹配 a$ |
\b | 匹配一个单词边界(前面的字符和后面的字符不全是\w) a\b |
- IgnoreCase忽略大小写模式
匹配时忽略大小写问题,但在正则表达式中是区分大小写的 - SingalLine单行模式
整个文本看作一个字符串,只有一个开头,一个结尾
使小数点"."可以匹配包含换行符\n在内的任意字符 - 多行模式
每行都是一个字符串,都有开头和结尾
在指定了MultiLine之后,如果需要仅匹配字符串开始和结束位置,可以使用\A,\Z
- 选择符和分组
表达式 | 作用 |
---|
l 分支结构 | 左右两边表达式之间 或 的关系,匹配左边或者右边 |
()捕获组 | 1)在被修饰匹配次数时,括号中的表达式可以作为整体被修饰2)取消匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到3)每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号,捕获元素编号为0的第一个捕获是由整个正则表达式模式匹配的文本 |
(?:Exception)非捕获组 | 一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用,可以节省内存 |
每一对()都会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号
通过反向引用,可以对分组已捕获的字符串进行引用
eg:([a-z]{2})\1 1代表括号的编号,\1是其括号内匹配到的内容,即将([a-z]{2})匹配到的结果重复一次
- 预搜索(零宽断言,环视)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度
- 这个位置应该符合某个条件,判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符,是对位置的匹配
- 正则表示式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认定这个子表达式是占有字符的,如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么认为这个子表达式是零宽度的,占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的
(?=exp) | 断言自身出现的位置的后面能匹配表达式exp |
---|
(?!=exp) | 断言此位置的后面不能匹配表达式exp |
(?<=exp) | 断言自身出现的位置的前面能匹配表达式exp |
(?<!exp) | 断言此位置的前面不能匹配表达式exp |
- java中使用正则
类Pattern
正则表达式的编译表示形式
Pattern p = Pattern.compile(s); //建立正则表达式,并启用相应模式
类Matcher
通过解释Pattern对character sequence执行匹配操作的引擎
Matcher m = p.matcher(str); //匹配str字符串
public static void main1(String[] args) {
Pattern p = Pattern.compile("\\w+");
String s = "ashlk1297";
Matcher m = p.matcher(s);
boolean result = m.matches();
System.out.println(result);
boolean result1 = m.find();
System.out.println(result1);
}
public static void main2(String[] args) {
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
Matcher m = p.matcher("aa24**sf45*hkj89");
while (m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));
System.out.println(m.group(2));
}
}
public static void main3(String[] args) {
Pattern p = Pattern.compile("[0-9]");
Matcher m = p.matcher("aa24**sf45*hkj89");
String s = m.replaceAll("#");
System.out.println(s);
}
public static void main4(String[] args) {
String s = "aa24sf45hkj89";
String[] split = s.split("\\d+");
System.out.println(Arrays.toString(split));
}