正则表达式

正则

正则表达式是用来描述具有一定特征的字符串的特殊字符串。Regular Expression。

a+b*c : a+ c 个的 b

(d+e)f:()->组,改变了优先级 ,f 个的 d+e

a+bc+(d+e)*f : 组合成复杂的表达式

实例

ab*: a 若干个 b ->* 零个及以上 ,匹配: a ab abbbbb abbbbbbb 不能 bbbbb。
(cd)😦)->组,改变了优先级 ,若干个 cd,匹配: “” cd cdcd cdcdcd ab(cd):a 若干个 b 和若干个
cd匹配: a ab abbbbb abbbbbbb acd acdcd abbbbbcd abcd ab|(cd)*:
|或的优先级低匹配: a ab cd ab|c : 匹配 ab c
在这里插入图片描述

作用

验证、查找、替换、分割 。

字符集

默认情况下区分大小写。
普通字符

非特殊含义以外的字符,如 a b 中国 上海尚学堂 。 普通字符精确匹配
元字符与转义

在这里插入图片描述

hello
world.
hello,
regex.
day
1+1=2.
11=2
111=2
11111=2
1+1=2
123+111=234
ab=c
11=1
1+1=2 –>1+1=2 1+1=2
11=2 111=2 11111=2

字符类

自定义

由[]组,只匹配一个, 需要注意以下四个:

^: 如果在第一个位置,表示取反的含义。

-表示一个区间即范围

] 最近一个位置为:结束 ,如果要表示普通的]请加

\ 转义
. 在字符类中 不是代表任意的字符,代表自身 . 的含义。 如果需要表示原有的含义,挪动位置 或者\ 。

[ae134] -> a e 1 3 4

[(as)] ->a s ( )

[a-z] ->小写字母

[-]a-z[] -> -[] 及小写字母
默认|标准字符类
在这里插入图片描述

gray
grey
hello
hallo
Hello
Hallo 0123456789
h[ea]llo –>hello hallo
h(e|a)llo ->hello hallo
[-\abc] -> - \ a b c
\d\s ->一个数字和一个空白
[\d\s] –> 数字 或 空白

量词

匹配的过程中,需要指定次数
在这里插入图片描述

coke –> 不限个数的 O
co+ke –>至少一个 O
co?ke ->1 个或零个 O
co{0}ke ->0 个
co{5,}ke –>5 次及以上

co{5,8}ke –> 至少 5 次,最多 8 次
[1-9]\d{3} –>大于等于 1000 小于等于 9999 的数 [1-9]\d{2,4} –>大于等于 100 小于等于 99999
的数 1[34578]\d{9} : 匹配手机号 <[a-zA-Z]+\d?> ->网页标签 <[A-Za-z][A-Za-z0-9]>
->网页标签

贪婪模式

在匹配次数不定时如* {n,} +,匹配字符越多越好,默认模式即”贪婪模
贪婪模式 greedy(匹配字符越多越好,可回溯)
?懒惰模式 lazy reluctant (匹配字符越少越好,可回溯)
+独占模式 possessive(匹配字符越多越好,不可回溯) 用的较少 cokecolacoooooooooooooke

.*o –>贪婪模式
.{2,}o–>贪婪模式
.{2,}?o –>懒惰模式
.{2,}+o –>独占模式,不可回溯 没有匹配到内容。
<.+?> ->找出标签 不要标签内的内容。不是
<.+> <[^>]+>->找出标签 不要标签内的内容。不是<.+>

阻止贪婪有两种方式
1、 量词后面使用? 2、 使用取反。

边界

1)、边界不占用宽度,只是一个界限
2)、^ :开始 \b:单词边界 \B:非单词边界 $:结束
^:多行代表每行头 单行代表整个字符串的开始
$: 多行代表每行尾 单行代表字符串的结尾
\b 匹配前面或后面的不是\w
\B 匹配前面或后面的是\w

查找开头的 hello -> ^hello
找出 独立的单词 world -> \bworld\b
查找结尾的 world ->world$

选择符

| ->优先级低 ,满足匹配则停止,不会查找更优的方案
he|hello –>只匹配 he,不匹配 hello
hello|he->匹配 he 与 hello

分组

匹配 ab c -> ab|c
匹配 ab ac -> a(b|c)
只匹配 get -> \bget\b
匹配 get 和 getValue -> getvalue|get get(value)?
获取 and or -> \band\b|\bor\b \b(and|or)\b

**反向引用:**内部默认缓存,从第一个左括号计算,编号为 1 开始。必须认识组编号,为 ( 的位置

(")test\1 –> “第 1 个左括号中
((")test)\2 –> “第 2 个左括号中
((("))test2)\3 –> “第 3 个左括号中
“’[”’] -> 错误的 找出合法的字符串"" 或’’
(["’])([^"’]+)\1 ->找出合法的字符串"" 或’

非捕获组:(?:xxx) : 不缓存组

(["’])(?:[^"’]+)\1 ->不缓存第二组,不能引用第二组
(?:["’])(?:[^"’]+)\1 –>所有的组都没有缓存,不能再引用了。

找出合法的标签

<(b)>(?:[^<]+)</\1> -> 13321
<(a-zA-Z?)>(?:[^<]+)</\1> -->找出合法的标签

模式修改符
(?ism )*(?-ism)
i: insensitive 使正则表达式对大小写不敏感;(重点) s: singleline 开启“单行模式”,即点号“.”匹配新行符;
m: multiline 开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置
(?i)select(?-i) -> 不区分大小写。

零宽断言

前瞻(Lookahead) 后顾(Lookbehind)

在这里插入图片描述

(\w+)(?<=ing) –>匹配 singing testing 整个单词 -> 后顾
(\w+)(?=ing) -->匹配 sing test ->前瞻

常用类

java.util.regex Pattern Matcher String
一般在查找、替换、分割、组的使用

Pattern

在这里插入图片描述

Matcher

在这里插入图片描述

例子

/** * 构建正则表达式 Pattern 与 Matcher *
*/
public class TestReg01 { 
public static void main(String[] args) { 
String str ="^(\\d+)shsxt"; 
//转成正则表达式 
Pattern p =Pattern.compile(str); 
//匹配 
Matcher m=p.matcher("abcshsxt11shsxt22shsxt"); 
//是否匹配 
System.out.println(m.find()); 
m=p.matcher("11shsxt22shsxt"); 
System.out.println(m.find()); 
str ="((\\d+)(shsxt))"; 
p =Pattern.compile(str); 
m=p.matcher("abcsxt11sxt22sxt"); 
//获取匹配的字符串 
while(m.find()){ 
//组 
System.out.println(m.groupCount()+"-->"+m.group()+"-->"+m.group(0)); 
//0-->整个表达式 
//从 1 开始获取 
System.out.println(m.group(2)+"-->"+m.group(3)); 
} 
  } 
     }

字符串与正则

在这里插入图片描述

String str ="and"; 
//完全匹配 
boolean flag =str.matches("\\b(and|or)\\b"); 
System.out.println(flag); 
str="\"happy\" and \"regex\" \"baidu\" or \"google\""; 
//替换所有 
str =str.replaceAll("\\b(and|or)\\b", "-->"); 
System.out.println(str); 
//分割 
str="\"happy\" and \"regex\" \"baidu\" or \"google\""; 
//切割 
String[] arr=str.split("\\b(and|or)\\b");
for(String temp:arr){ 
System.out.println(temp); 
}
arr=str.split("m"); 
//没有对应的,返回本身 
for(String temp:arr){ 
System.out.println(temp); 
}
//. -->任意字符 
str ="192.168.1.234"; 
arr=str.split("\\."); 
//注意转义 
for(String temp:arr){ 
System.out.println(temp); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值