正则表达式学习

入门

开始和结束

正则表达式中 ^ 指定的是一个字符串的开始,$ 指定的是一个字符串的结束。
例如,
匹配以p开头的python字符串:
在这里插入图片描述
匹配以n结尾的python字符串:
在这里插入图片描述

字符组[]

[]表示匹配括号中的任意一个字符,-表示字符范围,^表示不匹配后面的所有字符

例如:
在这里插入图片描述
可以发现 [Pp] 既可以匹配大写的P也可以匹配小写的p

例如:

在这里插入图片描述
在这里插入图片描述

1
^[^xy]1$ 可以匹配 a1、b1、c1,但是不能匹配x1、y1

参考链接:正则表达式 “中括号[]” 内需要转义的字符

区间[]

正则表达式引擎在字符组中使用 连字符- 代表区间,依照这个规则,我们可以总结出三点:

  • 要匹配任意数字,可以写成 [0-9]
  • 要匹配所有小写字母,可以写成 [a-z]
  • 要匹配所有大写字母,可以写成 [A-Z]

特殊字符转义

在正则中使用 \ 就可以进行对特殊符号进行转义。
例如,匹配圆括号:

1
\(

取反

通过在字符数组开头使用 ^ 字符实现取反操作。
例如:匹配不包含数字的字符组:
在这里插入图片描述

快捷匹配数字和字母

下面是快捷匹配元字符与取反元字符:

元字符 描述
\w 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
\d 与任意数字匹配
\W 与任意非单词字符匹配
\D 与任意非数字匹配

匹配空白

\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。

任意字符

. 代表匹配任何单个字符,它只能出现在方括号以外

注意:. 不能匹配换行符(\n)

重复次数和区间

重复次数:
在一个字符组后加上 {N} 就可以表示在它之前的字符组出现N 次。
重复区间:
在一个字符组后加上 {M,N},M是下界而N是上界。
例如:
在这里插入图片描述
\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ? 号。
在这里插入图片描述
开闭区间:
在一个字符组后加上 {M,},M是下界,无上界。
例如:
在这里插入图片描述
表示匹配一个或无数个数字。

或者条件

使用分组、字符组的同时还可以使用 或者条件
例如:
在这里插入图片描述
表示要提取所有相关的后缀名。
在这里插入图片描述
表示匹配字符组中为北或者大的。

进阶

分组

要实现分组很简单,使用 () 即可。
例如:
在这里插入图片描述
这段正则表达式将文本分成了两组,第一组为:0731,第二组为8825951。
分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。

非捕获分组

有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组 (?:表达式)不获取匹配结果,不进行存储供以后使用
例如,
在这里插入图片描述
在这里插入图片描述
通过上面的例子可以看出,使用 ?: 后续引用分组 \1 无效

分组的引用

使用 \N 可以引用编号为N的分组。
例如:
在这里插入图片描述

向后查找:正向先行断言

(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式。
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你),这就是正向先行断言。
在这里插入图片描述

向后查找:反向先行断言

(?!表达式) 的作用是保证右边不能出现某字符。
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你),这就是反向先行断言。

在这里插入图片描述
匹配不能包含 test 的字符串:

1
/^((?!test).)*$/

在这里插入图片描述
匹配不能包含 test 和 name:

1
/^((?!test|name).)*$/

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
// 向后查找:不以"-"开头的
^(?!-)
// 向后查找:不以"-"结尾的
(?!-)$
// 不包含给定特殊字符的
^[^!@#$%^&*()【】]{0,}$
// 只能输入中文、字母、数字和中文顿号
^[\u4E00-\u9FA5A-Za-z0-9、]+$
// 只能输入中文、字母、数字和中文顿号,并且不以中文顿号开头和结尾
^(?!、)([\u4E00-\u9FA5A-Za-z0-9、]+)(?<!、)$

向前查找:正向后行断言

先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看
(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式。
例如:
如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)
在这里插入图片描述

向前查找:反向后行断言

(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式。
例如:
如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)
在这里插入图片描述

常用元字符整理

元字符 描述
\ 给特殊字符转义。例“\\”匹配“\”
^ 匹配一个字符串的开始
$ 匹配一个字符串的结束
* 匹配前面的子表达式任意次。等价于{0,}
+ 匹配前面的子表达式一次或多次(大于等于1次)。等价于{1,}
? 匹配前面的子表达式零次或一次。。等价于{0,1}
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。
{n} n是一个非负整数。匹配确定的n次。
{n,} n是一个非负整数。至少匹配n次。
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。
. 匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
| 或者。例如x|y,匹配x或y
^ 取反。例如[^0-9],匹配不包含数字的字符组
(pattern) 匹配pattern并获取这一匹配,即分组。一个正则表达式中最多可以保存9个组
(?:pattern) 非捕获分组,匹配pattern但不获取匹配结果,不进行存储供以后使用。
(?=pattern) 正向先行断言,在某个位置向右看,表示所在位置右侧能匹配表达式。
(?!pattern) 反向先行断言,在某个位置向右看,保证右侧不能匹配表达式。
(?<=pattern) 正向后行断言,在某个位置向左看,表示所在位置左侧能匹配表达式。
(?<!pattern) 反向后行断言,在某个位置向左看,保证左侧不能匹配表达式。
\b 匹配一个单词的边界,也就是指单词和空格间的位置。
\B 匹配一个非单词的边界。
\d 与任意数字匹配
\W 与任意非单词字符匹配
\D 与任意非数字匹配
\w 与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
\f 匹配一个换页符。
\t 匹配一个制表符。
\n 匹配一个换行符。
\r 匹配一个回车符。
\s 匹配一个空白符,即不可见字符,包括空格、制表符、换页符等等
\S 匹配一个非空白符,,即可见字符

参考链接

相关网站

在线测试网站

菜鸟工具:
参考链接
有详细的语法解释,但是"/"需要转义:
参考链接

题目练习网站

参考链接

其他笔记

1
2
3
1、正斜杠/在Java正则表达式中不是特殊字符,不需要转义。 "\\\\/"等效于"/"
2、Java Match类中的matches()方法是完全匹配,即整个字符串必须匹配该正则表达式;find()方法是部分匹配,即在整个字符串中,寻找匹配该正则表达式的子字符串序列,只要找到这样的子字符串,即返回true
3、(ab){1,3},表示ab一起连续出现最少1次,最多三次。ab{1,3},表示a后面紧跟的b出现的最少一次,最多三次。这就是括号分组的意义。