JAVA学习笔记(正则表达式)

1. 匹配规则

1.1 单字符匹配

[ ]    // 例如 [abc] 代表一个a或者一个b或者一个c

1.2 多字符匹配

" " // 例如 "abc" 代表连续的一个字符串abc

1.3 量词

* 表示0次以上, + 表示1次以上, ? 表示0次或1次。

{n}表示固定n次,{n,}表示n次及以上,{n,m}表示n到m次

1.4 边界符

^ // 开始边界  例如"^a" 代表以a开始

$ // 结束边界 例如 "b$" 代表以b结束

备注:字符串和正则类的""中的规则默认都是有开始^和结束$的,默认省略不写。

"^[abc]$"等价与"[abc]"

1.5 分组

( ) // 例如 ([abc])(abc) 1组是一个字符a或b或c, 2组是一个字符串abc

1.6 逻辑

|  // 或 例如 "ab | bc"  一个字符串ab或bc

^ // 非 在[ ] 中  例如 [^a] 代表 a以外的字符

1.7 修饰符

(?i)  // 例如 "ab(?i)[a-z]+"  代表忽略(?i)后字母的大小写,"a((?i)b)[a-z]+"只忽略b大小写

1.8 预定义

\d 代表[0-9], \D 代表[^0-9]

\w 代表[a-zA-Z0-9_] , \W 代表[^a-zA-Z0-9_]

\n 换行,\t 指标, \b 边界符匹配\w以外任意,. 点匹配换行以外任意。

1.9 转义字符

[ ] 中 除了^和-,和预定义字符,其他符号会失去意义。如果需要输出^ - 或预定义的字符串,则需要\做转义 例如:\\代表一个\,\^代表一个^字符。

2. Java字符串

下记方法底层都是调用正则类,所以多次调用最好用正则类的方式。

重要:不加量词默认只能是1个。

2.1 matches(判断字符串是否完全满足规则)

"1ab3".matches("[abc]+") // false   判断是否完全满足一个以上a或b或c

"abaca".matches("[abc]+") // true  ,java字符串\需要转移所以已定义写法"13".matches("\\d+");

2.2 replace和replaceAll(替换字符串)

"1ab3".replace("a", "z"); // 返回1zb3,将a替换成z,replace只能指定字符串,不能指定正则

"abacad".replace("a", "z"); // 返回zbzczd

"1ab3".replaceAll("[abc]", "z"); // 返回1zz3

"abacad".replaceAll("[abc]", "z"); // 返回zzzzzd

字符串.replaceAll("(正则)|(正则)", "<$1>") // $1代表第一组正则,本语句可以将满足第一组正则的字符替换为<加正则元字符加>。相当于把满足规则的字符用<>包起来。

例如:"a1b2a5d".replaceAll("([abc])","<$1>"); 得到 "<a>1<b>2<a>5d"

2.3 split(分割字符串)

"1a3".split("[abc]") // 返回 数组 ["1","3"]

"a1b2a5d".split("[abc]") // 返回 数组 ["","1","2","5d"]

3. 正则类

3.1. 使用

1. 定义规则:Pattern p = Pattern.compile("正则") // 编译正则 例如

2. 关联字符串: Matcher m = p.matcher(字符串) // 例如

3. 做处理:

m.find() // 是否部分匹配,while(m.fing()) { m.start()//当前配置字符开始下标,m.end()// 结束下标,m.group(0)获取匹配字符串,}

m.matches() // 是否全部匹配,m.group(下标) 0:全文字符串,1:满足第一个()分组的字符串

例如:Pattern p = Pattern.compile("([abc]+)|(..[0-9]{1})");

Matcher m2 = p.matcher("abaca");

m.group(1)  // "abaca"

m.group(2) // null

3.2. 贪婪匹配

匹配规则默认从左到右

正常逻辑

Pattern p = Pattern.compile("(\\d+)(0+)");

Matcher m = p.matcher("1230"); // m.group(0)=1230, m.group(1)=123, m.group(2)=0

贪婪匹配(在保证后面规则基础上,会尽量满足前面规则)

Pattern p = Pattern.compile("(\\d+)(0+)");

Matcher m = p.matcher("12300"); // m.group(0)=12300, m.group(1)=1230, m.group(2)=0

非贪婪匹配(在左侧规则量词后加?,优先其他正则组)

Pattern p = Pattern.compile("(\\d+?)(0+)");

Matcher m = p.matcher("12300"); // m.group(0)=12300, m.group(1)=123, m.group(2)=00

3.3 常见用法

1,字符串,是否包含,满足规则的正则。正则类Matcher.find()

2,字符串,是否完全满足规则。正则类Matcher.matches(), 字符串.matches(正则)

3,查询,满足规则的字符。正则类 Matcher.find() ,Matcher.group(0)

4,替换,满足规则的字符。正则类Matcher.replaceAll(字符), 字符串.replaceAll(正则, 字符)

猜你喜欢

转载自blog.csdn.net/m0_65939803/article/details/131216616