正则表达式

常用表达式

.               除了换行符外的任何字符
|               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})
序号名称分组内容
00(0\d{2})-(\d{8})020-12345678
1name1(0\d{2})020
2name2(\d{8})12345678

非捕获组:标识那些不需要捕获的分组(排除它),也就是根据需要,保存你需要保存的组
(?:0\d{2})-(\d{8}) 排除第一个分组,结果如下

序号名称分组内容
00(0\d{2})-(\d{8})020-12345678
11(\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次以上,但尽可能少重复
    以上默认都为 贪婪模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值