语法一:普通字符
- 字母,数字,汉字,下划线,以及没有特殊定义的标点符号,都是“普通字符”。表达式种的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
例如:
被匹配到的文本,会以黄蓝相隔
简单的转义字符:
字符 | 作用 |
---|---|
\n | 代表换行符 |
\t | 制表符 |
\\ | 代表\本身 |
\^,\$,\.,\(,\),\{,\},\?,\+,\*,\|,\[,\] | 匹配这些字符本身 |
语法二:标准字符集合
- 能够与“多种字符” 匹配的表达式
- 注意区分大小写,大写是相反的意思
字符 | 作用 | 大写 | 作用 |
---|---|---|---|
\d | 任意一个数字,0-9中的任意一个 | \D | 匹配除了数字以外的字符 |
\w | 任意一个数字或字母或下划线,也就是A~Z a~z 0~9 _ | \W | 匹配除了A~Z a~z 0~9 _ 以外的字符 |
\s | 包括空格,制表符,换行符等空白字符的任意一个 | \S | 匹配除了空格,制表符,换行符以外的字符 |
. | 小数点可以匹配任意一个字符(除了换行符) |
例如:
语法三:自定义字符集合
- [ ] 方括号匹配方式,能够匹配方括号中任意一个字符。
[ab5@] | 匹配a 或b 或5 或@ 当中任意一个。 |
[^abc] | 匹配a ,b ,c 之外的任意一个字符,^ 在方括号里是取反的意思 |
[a-c] | 匹配a~c 之间任意一个字母 |
正则表达式的特殊符号 除了
^ ,-
之外,如果被包含在方括号里,则失去特殊意义,也是当普通字符处理
例如:
量词
{n} | 表达式重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? | 匹配表达式0次或1次,相当于{0,1}(这个问号并不是非贪婪模式那个问号) |
+ | 表达式至少出现一次,相当于{1,} |
* | 表达式不出现或出现任意次,相当于{0,} |
例如:
匹配次数中的贪婪模式(匹配字符越多越好,默认是这个模式)
匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个"?"
号)
?
的使用:
效果是一样的
+
的使用
*
的使用:
字符边界
本组标记匹配的不是字符 而是位置,符合某种条件的位置
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
^
左边是字符串开始的位置 才符合
$
右边是字符串结束的位置 才符合
\b
单词边界:\b在的位置不全是\w (也就是不全是 数字或字母或下划线)
选择符和分组,反向引用
|
表达式:
()
捕获组 反向引用:
每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始编号
(?:)
非捕获组 :不在内存中存储匹配到的结果
零宽断言
其实很简单,就是说 匹配一个字符串,前面要满足什么条件或者后面要满足什么条件,但是条件并不加入最后的匹配结果…
(?=exp)
:后面需要满足xxx条件(exp 为独立的表达式)
(!=exp)
:后面不能是xxx条件(exp 为独立的表达式)
常用配置
练习:
电话号码: 0开头 2~3位数字 - 7~8 位数字
手机号码:1开头 35789任意一个 后面接9位数字
Java 中使用正则
相关类位于:java.util.regex 包下面
类:Pattern:
类:Matcher
// 表达式对象
Pattern p = Pattern.compile("\\w+");
// 创建Matcher对象
Matcher matcher = p.matcher("dslfjsdalfjdsl");
Matcher matcher2 = p.matcher("dslfjsda&&lfjdsl");
// while (matcher2.find()) {
// System.out.println(matcher2.group());
// }
System.out.println(matcher.matches()); // true // matches 匹配整个区域
System.out.println(matcher2.find()); // true 该方法扫描输入的序列,查找与该模式匹配的下一个序列 也就是说,这一次find 查找的是dslfjsda
// System.out.println(matcher.group()); // 返回查找到的序列
System.out.println(matcher2.find()); // true 这一次 找到的是 lfjdsl
System.out.println(matcher2.find()); // false 这一次 没有找到下一个子序列了
// 表达式对象
Pattern p = Pattern.compile("[0-9]");
// 创建Matcher对象
Matcher matcher = p.matcher("dslf123jsdalf44jdsl544");
// 把所有数字替换为 #
String replaceAll = matcher.replaceAll("#");
System.out.println(replaceAll); // dslf###jsdalf##jdsl###
单词分词器
String str = "fjsld flJJd fdsf ds.1998 (now) lfjsdl jljlk jj? .";
Pattern p = Pattern.compile("\\b[0-9A-Za-z]+");
Matcher matcher = p.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}