前言
- 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。
- 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
- 通过正则表达式处理字符串复杂的查找/替换/匹配/分割工作。
实例
概念
使用单个字符串来描述/匹配一系列符合某个语法规则的字符串
步骤
- 通过大量的字符串找规律定义规则。
- 使用这种规则去匹配新的字符串。
- 匹配成功作出相应的操作(匹配 查找 替换 分割)。
工具
字符
正则表达式由两种基本字符组成
原义字符:字符本身就是一个正则 \t \n \r \f
元字符: * + ? $ ^ () [] {}...
对正则表达式进行分类:
字符类: [abc] 将字符进行归类,可以出现[]中的其中一个 对abc其中一个进行匹配
[^abc] 对不是abc的字符进行匹配- 范围类:
[a-z] 表示代表a-z中的一个字符
表示所有的英文字母和数字 [a-zA-Z0-9] 预定义类:
\d == [0-9] 数字
\D == [^0-9] 非数字
空白字符:[ \t\n\x0B\f\r] == \s
[^ \t\n\x0B\f\r] == \S
[a-zA-Z0-9] \w
[^a-zA-Z0-9] \W
. 任何字符(与行结束符可能匹配也可能不匹配)边界字符
^:以XXX开头
$:以XXX结尾
\b:单词边界
\B:非单词边界量词
?:出现0次或者1次
+:出现1次或者多次
*:出现任意次
{n}:出现正好n次
{n,m}出现n-m次
{n,}出现至少n次分组 ()
如何让Jack出现至少3次
(Jack){3,}
忽略分组:每一组能够分组,但是没有编号 ?:
或
Ja(ck|Love)Kitty反向引用
利用分组的编号进行反向引用
反向引用使用$,必须先分组
2018-04-27 ==> 04/27/2018
在Java中的应用
1.字符串查找操作 Pattern和Matcher
2.字符串匹配操作 字符串的matches()方法
3.字符串替换操作 字符串的replaceAll()和replaceFirst()方法
4.字符串分割 split() 方法
测试
验证手机号
匹配如下四个手机号
18079243050
15160869850
18765068050
14235452850
- 分析:
1.以1开头
2.一共11位
3.50结尾
4.倒数第三位是 0 或者 8
public class Test424_1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入手机号");
String s = input.next();
String regex = "^1[0-9]{7}(0|8)(50)$";
System.out.println(s.matches(regex));
}
}
日期替换
2016/03/05
demo/07/ss
1993/08/05
2016/11/24
12345/23/45678
12345/24/3356
1993-08-05
将正确的日期格式替换为03-05-2016
- 分析:
1.原日期为年月日
2.替换日期为月日年
3.利用分组()和$反向引用
public class Test424_3 {
public static void main(String[] args) {
String s = " 2016/03/05 "
+ " demo/07/ss"
+ " 1993/08/05"
+ " 2016/11/24"
+ " 12345/23/45678"
+ " 12345/24/3356"
+ " 1993-08-05";
String regex ="\\b(\\d{4})[/-](\\d{2})[/-](\\d{2})\\b";
System.out.println(s.replaceAll(regex, "$2-$3-$1"));
}
}
推荐书籍:《正则表达式必知必会》
以上