Java 正则表达式
正则表达式是用来处理字符串的,常见的操作有:
l 字符串匹配
l 字符串替换
l 提取信息
1、 基础
1.1、 字符
字符 | |
B | 指定字符B |
\xhh | 十六进制值为oxhh的字符 |
\uhhhh | 十六进制为oxhhhh的Unicode字符 |
\t | 制表符tab |
\n | 换行符 |
\r | 回车 |
\f | 换页 |
\e | 转义 |
1.2、 字符类
字符类 | |
. | 任意字符 |
[abc] | 包含a、b、c的任意字符 |
[^abc] | 除了a、b、c之外的任意字符 |
[a-zA-Z] | 从a-z或A-Z的任意字符 |
[abc[hij]] | 等同于a|b|c|h|i|j(或操作) |
[a-z&[hij]] | 任意h、i、j(与操作) |
\s | 空白符(空格、tab、换行、回车) |
\S | 非空白字符[^\s] |
\d | 数字[0-9] |
\D | 非数字[^\d] |
\w | 词字符[a-zA-Z0-9] |
\W | 非词字符[^\w] |
1.3、 逻辑操作符
逻辑操作符 | |
XY | Y在X后面 |
X|Y | X或 |
(X) | 捕获组,可以在表达式中用\i来引用第i个捕获组 |
1.4、 边界匹配符
边界匹配符 | |
^ | 一行的起始 |
$ | 一行的结束 |
\b | 词的边界 |
\B | 非词的边界 |
\G | 前一个匹配的结束 |
1.5、 量词
量词描述了一个模式吸收输入文本的方式:
l 贪婪型
贪婪表达式会为所有可能的模式发现尽可能多的匹配
l 勉强型
用问号来指定,这个量词会匹配满足模式所需的最少字符数
l 占有型
目前,这种类型的量词只在Java中可用。当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯;而占有的量词并不保存这些中间状态,因此它可以防止回溯,可以使正则表达式执行起来更有效。
量词 | |||
贪婪型 | 勉强型 | 占有型 | 如何匹配 |
X? | X?? | X?+ | 一个或零个 |
X* | X*? | X*+ | 零个或多个 |
X+ | X+? | X++ | 一个或多个X |
X{n} | X{n}? | X{n}+ | 恰好n次X |
X{n,} | X{n,}? | X{n,}+ | 至少n次X |
X{n,m} | X{n,m}? | X{n,m}+ | 至少n次X,不超过m次 |
2、 String
String类提供了有限的正则表达式匹配,如matchs、replace、split等。
3、 Pattern、Matcher
一般来说。比起有限的String类,我们更愿意构造功能更强大的正则表达式对象,步骤如下:
1) 使用Pattern.compile方法先编译正则表达式会生成Pattern实例;
2) 将要检索的字符串传入Pattern实例的matcher方法,会返回一个Matcher实例;
3) Matcher实例有很多方法可用,如matches、replace、find等;
//先将一个正则表达式编译为Pattern来提高效率
Pattern pattern=Pattern.compile("\\d{4}");
//通过mather可以获取大量有用的信息
Matcher matcher=pattern.matcher("2222-3333");
//System.out.println(matcher.matches());
//将查找的指针重置,回到起始位置
//matcher.reset();
//顺序匹配相应的字符串
//System.out.println(matcher.find());
//每进行一次find,就可以将匹配的字符串通过group获取
while (matcher.find())
{
//起始位置、结束位置
System.out.println("["+matcher.start()+","+matcher.end()+"]");
System.out.println(matcher.group());
}
4) 可以使用括号对元素进行分组,如下
String str="410425199008261234,410425199503266543";
Pattern pattern=Pattern.compile("(\\d{6})(\\d{8})(\\d{4})");
Matchermatcher=pattern.matcher(str);
while (matcher.find())
{
//下标从1开始
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}