常用表达式
. 除了换行符外的任何字符
| A|B|C 匹配A或者B或者C任意一个字符
\ 转义字符,将特殊字符变为普通字符,. 表示点号本身。或将普通字符变为特殊字符,\d表示十进制数字
[…] 匹配所包含的任一字符
\w 匹配任意Unicode字符,包括下划线和数字
* 匹配前面子表达式或字符零次或多次
+ 匹配前面子表达式或字符一次货多次
? 匹配前面子表达式零次或一次. 或者启用非贪婪模式。 默认情况下, + ,*和? 是贪婪匹配,尽可能多的匹配字符, 但是
后面加上?就是非贪婪匹配。
abcccccccc 正则 abc+? 结果为 abc 不加?为 abcccccccc匹配完
abcccccccc 正则 abc*? 结果为 ab 不加?为 abcccccccc匹配完
abcccccccc 正则 abc?? 结果为 ab 不加?为 abc
ababcccccccc 正则 a(bc)*? 结果为 a 这里(bc)为子表达式
{m,n} 匹配前面子表达式或字符m次到n次,默认也为贪婪模式 后面加?就是非贪婪模式
(…) 子组。子组的内容可以在匹配之后被\数字
再次引用,见下面反向引用
,以重复匹配某一个单词
-
条件或 : ^(130|131|132|155|156|185|186|145|176)\d{8}$
-
限定 0 到 9 可以写成 [0-9]
-
限定 A-Z 写成 [A-Z]
-
限定某些数字 [1657]
^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$
正前瞻 正后顾
正前瞻: (?=pattern) 匹配某个单词的前面部分
<span class="zan-count">点赞数:649991</span>
序号 | 正则 | 含义 | 结果 |
---|---|---|---|
1 | .+(?=</span> ) | 匹配</span> 前面的任意字符 | <span class="zan-count"> 点赞数:649991 |
2 | \d+(?=</span> ) | 匹配</span> 前面的数字 | 649991 |
例子:
^(?=.*?[0-9]).{4}
文本: 0h23absfdsfafa
结果: 0h23
.*?[0-9] 这句话只保证整个字符串一定要有数字,(假如没有数字,那什么也匹配不到)
只是不一定被匹配到这个数字而已。 又要满足四位的需求,故在最前面匹配四位 0h23
假如 文本为 ahaaab3sfdsfafa 文本中存在数字3 结果为ahaa 这里的数字就没匹配到
假如 文本为 ab5og8 文本中存在数字,结果为匹配前四位 ab5o
^(?=.*?[0-9])(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[@!#$%^&*()_+\.\?<>'"|=]+).{8,}$
整个表达式可分为四个组 有四个小括号
(?=.*?[0-9]) 1 这里确定必须有一个数字
(?=.*?[a-z]) 2 这里确定必须有一个小写字母
(?=.*?[A-Z]) 3 这里确定必须有一个大写字母
(?=.*?[@!#$%^&*()_+\.\?<>'"|=]+) 4 这里确定必须有一个特殊字符
确定整个字符串有这些字符后 再从前往后数8个或以上就行了。注意上面这些只是确认整个字符串里有这些字符,但并不一定匹配到
正后顾: (?<=pattern) 匹配某个单词的后面部分
---------------------------------------------------------------------------
负前瞻 负后顾
负前瞻:(?!pattern)
例子:“我爱学习,因为学习让我快乐”
句子里有两个学习,现在要找到不是’让我快乐’前面的学习,即第一个学习
(没觉得多大卵用)
序号 | 正则 | 结果 |
---|---|---|
1 | 学习(?!让我快乐) | 学习 |
负后顾:(?<!pattern)
捕获 和 非捕获
1 数字编号 捕获组
例子; 020-12345678 (0\d{2})-(\d{8})
第0个为本身 分组的个数有:2
第0个分组为:020-12345678
第1个分组为:020
第2个分组为:12345678
2 命名编号 捕获组
"020-12345678"
(?<name1>0\d{2})-(?<name2>\d{8})
序号 | 名称 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) | 020-12345678 |
1 | name1 | (0\d{2}) | 020 |
2 | name2 | (\d{8}) | 12345678 |
非捕获组:标识那些不需要捕获的分组(排除它),也就是根据需要,保存你需要保存的组
(?:0\d{2})-(\d{8}) 排除第一个分组,结果如下
序号 | 名称 | 分组 | 内容 |
---|---|---|---|
0 | 0 | (0\d{2})-(\d{8}) | 020-12345678 |
1 | 1 | (\d{8}) | 12345678 |
反向引用
1.例子:比如要查找一串字母"aabbbbgbddesddfiid"里成对的字母。
捕获组有两种命名方式,一种是是根据捕获分组顺序命名,一种是自定义命名来作为捕获组的命名在默认情况下都是以数字来命名,而且数字命名的顺序是从 1 开始的
(\w)\1
2.把字符串中abc换成a
String test = "abcbbabcbcgbddesddfiid";
String reg="(a)(b)c";
System.out.println(test.replaceAll(reg, "$1")); $1引用的是a
贪婪和非贪婪
贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这匹配方式叫做贪婪匹配。
特性:一次性读入整个字符串进行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃(这种 匹配 - 舍弃的方式也叫做回溯),直到匹配成功或者把整个字符串舍弃完为止,因此它是一种最大化的数据返回。
默认情况下如 ?
,*
, + {3,6}
为贪婪匹配
- *重复零次或更多次
- +重复一次或更多次
- ? 重复零次或一次
- {n} 重复n次
- {n,} 重复n次或更多次
- {n,m} 重复n到m次
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复
以上默认都为 贪婪模式