定义:是指一个用来描述或者匹配一系列符合某个语法规则字符串的字符串 ,其实就是一种规则。、
字符类: []代表单个字符
[abc] a 或b或c其中的某一个字符
[^abc] 任何字符 除了 a,b,c
[a-zA-Z] a到z或A到Z 两头的字母都包括在内
[a-d[m-p]] a到d 和m到p(并集)
[a-z&&[def] def (a-z这个范围和def这个范围的交集)
[a-z&&[^bc]] a到z 除了bc
[a-z&&[^m-p]] a到z 除了m-p
预定义字符类: \有转义的意义 要多加一个\ eg:\\d
. 任何字符
\d 数字[0-9]
\D 非数字[^0-9]
\s 空白字符
\S 非空白字符
\w单词字符 [a-zA-Z_0-9]
\W非单词字符
数量词:
X? X出现一次或一次也没有
X * X出现零次或多次
X + X出现一次或多次
X{n} X出现n次
X{n,} X出现至少n次
X{n,m} X出现至少n次 但不超过m次
正则表达式的分割功能 (String类的方法)
public static [] split(String regex) 以指定正则表达式去分割字符串 返回字符串数组
正则表达式的替换功能
public String replaceAll(String regex,String replacement) 参数分别是正则表达式和替换后的字符
正则表达式的分组功能
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1.((A)(B(C)))
2.\A
3.(B(C))
4.(C)
组零始终代表整个表达式。
练习
叠词 快快乐乐 高高兴兴
String regex="(.)\\1(.)\\2"; \\1代表的是第一组(.)出现1次 \\2代表的是第二组(.)出现2次
叠词 好啦好啦
String regex="(..)\\1";
按照叠词切割字符串
String word="sdqqfgkkjhppppkl";
String [] str=word.split("(.)\\1+");
需求 把字符串“我.我.我...要...要...要.学学...编编....编.程...程” 还原成“我要学编程”
String word="我.我.我...要...要...要.学学...编编....编.程...程";
//先把.字符去掉
word=word.replaceAll("\\.+"," ");
//把重复的字符用组中的数据替换掉 $1代表的是组一的值
String newWord=word.replaceAll("(.)\\1+","$1");
Pattern类和Matcher类
典型的调用顺序是
Pattern p = Pattern.compile
("a*b"); //获取正则表达式 Matcher m = p.matcher
("aaaaab"); //根据正则表达式生成匹配器 boolean b = m.matches
();
//练习 :获取 字符串包含的电话号码
String word="我的电话号码是13528669636 以前曾经用过 13728470633 和 13342607602";
String regex="1[3578]\\d{0}"; //电话号码的正则表达式 第一位数字固定 1 第二位 从 3578中一位 后9位都是其他数字
Pattern p=Pattern.compile(regex); //获取正则表达式
Matcher m=m.matcher(word); //根据正则表达式和要查询的语句生成匹配器
while(m.find()) //匹配是否存在符合正则表达式的字符串 有就返回true 没有返回false
System.out.println(m.group()); //group()方法把匹配的字符串输出 每次匹配到都会从匹配到的后面开始搜索
需要特别注意的是:必须先使用find()方法 ,如果在没有尝试任何匹配就使用group()方法就会报错