1 正则表达式基本知识
1.1 定义
- 是用来匹配字符串的一种模式
- 是文本处理中常用的工具
- 主要应用包括:匹配验证、分割、查找、替换
1.2 正则表达式的写法
- 字符{数量}位置
- 如 [0-9]{2,4}\b 可以匹配 123 1988 2015 16
1.3 正则表达式的基本元素
符号 | 含义 | 描述 |
. | 代表一个字符的通配符 | 能和回车符之外的任何字符匹配 |
[] | 字符集 | 能和括号内任何一个字符相匹配,方括号内也可以表示一个范围,用"-"符号将起始和末尾字符区分开来,如[0-9] |
[^] | 排斥性字符集 | 和集合之外的任意字符匹配 |
^ | 起始位置 | 定位到一行的起始处并向后匹配 |
$ | 结束为止 | 定位到一行的结尾处并向前匹配 |
\b | 单词边界 | |
\B | 非单词边界 | |
() | 组 | 按照子表达式进行分组 |
| | 或 | 或关系的逻辑选择,通常与组结合使用 |
\ | 转义 | 匹配反斜杠符号之后的字符,所以可以匹配一些特殊字符,如$,|等 |
关于数量
符号 | 含义 | 描述 |
* | 零个或多个 | 匹配表达式首项字符的零个或者多个副本 |
+ | 一个或者多个 | 匹配表达式首项字符的一个或者多个副本 |
? | 一个或零个 | 匹配表达式首项字符的一个或者零个副本 |
n | 重复 | 匹配表达式首项字符的n个副本 |
关于字符
符号 | 含义 | 描述 |
\d | 数字 | 相当于[0-9] |
\D | 非数字 | 相当于[^0-9] |
\s | 空白符 | 相当于[\t\n\c0B\f\r] |
\S | 非空白符 | 相当于[^\S] |
\w | 单词字符 | 相当于[A-Za-z_0-9] |
\W | 非单词字符 | 相当于[^\W] |
2 java API中正则表达式类
- 包:java.util.regex
- 主要类:Pattern类/Matcher类
2.1 应用1:分割 split
示例:
import java.util.regex.*; public class RegexSplitter { public static void main(String[] args) { // TODO Auto-generated method stub Pattern p = Pattern.compile("[;,\\s0-9]+"); String[] splits = p.split("add;df,ds kk dd09fgh"); for(String splitter : splits){ System.out.println(splitter); } } } 输出结果: add df ds kk dd fgh
2.2 应用2:匹配验证 Pattern.matches()
示例:判断Email是否合法
import java.util.regex.*; public class RegexEmailValidate { public static void main(String[] args) { // TODO Auto-generated method stub String pattern = "^[^@]+@[\\w]+(\\.[\\w]+)*$"; String email = "pe-n.g1 2A_d@midea.com.cn"; boolean b = Pattern.matches(pattern,email); if(b) System.out.println("邮箱号可用\n"); else System.out.println("邮箱号不可用\n"); } }
2.3 应用3:替换查找 Matcher类
- Matcher类:通过调用某个模式(Pattern对象)的matcher方法可以得到Matcher对象
- Matcher类的方法:find方法将扫描输入序列,寻找下一个与模式匹配的地方;appendReplacement方法
- Matcher中的group是指正则表达式中一对圆括号括起来的一部分;group(0)或group()表示整个匹配项,group(1)、group(2)…表示各个分组
- 替换时,$0表示整个匹配项,$1、$2…表示各个分组(圆括号)
示例1:
import java.util.regex.*; public class RegexReplacement { public static void main(String[] args) { // TODO Auto-generated method stub Pattern pattern = Pattern.compile("cat"); Matcher matcher = pattern.matcher("one cat; dacatd de cad"); StringBuffer sb = new StringBuffer(); while(matcher.find()){ matcher.appendReplacement(sb, "big $0"); } matcher.appendTail(sb); System.out.println(sb.toString()); } } 输出结果: one big cat; dabig catd de cad
示例2:group的应用
import java.util.regex.*; public class RegexHref { public static void main(String[] args) { // TODO Auto-generated method stub String regex = "\\s*(href|src)\\s*=\\s*((\"[^\"]*\")|(\'[^\']*\')|([^\'\">\\s]+))"; String text = "<a href=\"http://aaa.htm\">bbb</a> <img src=\'http://bb.com/pic.jpg\'>" + "<img src= http://bdfb.com/pic.jpg >"; Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(text); MatchResult result = matcher.toMatchResult(); StringBuffer buffer = new StringBuffer(); int i = 0; while(matcher.find()){ //整个捕获,相当于goup(0) i++; buffer.append("获捕到" + matcher.group()); //捕获中的一部分(第2对圆括号对应的,即是网址) buffer.append(" 其中网址为" + matcher.group(2)); buffer.append("\r\n"); } System.out.println(buffer.toString() + i); } }
总结:
- group(n)分类法则
- find()所遍历出的group大组,取决于实际字符串中对应匹配模式的字符串数目