Java正则表达式
一、正则表达式简介
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
1)什么是正则表达式
正则表达式(Regluar Expressions)又称规则表达式,这个概念最初是由Unix中的工具软件(如sed 和 grep)普及开的。正则表达式在代码中常简写为REs,regexes或regexp(regex patterns)。它本质上是一个小巧的、高度专用的编程语言。 许多程序设计语言都支持通过正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
2)正则表达式能做什么
正则表达式的主要应用对象是文本,使用正则表达式可以指定想要匹配的字符串规则,然后通过这个规则来匹配、查找、替换或切割那些符合指定规则的文本。总体来讲,正则表达式可以对指定的文本实现以下功能:
● 匹配验证:判断给定的字符串是否符合正则表达式所指定的过滤规则,从而可以判断某个字符串的内容是否符合特定的规则(如email地址、手机号码等);当正则表达式用于匹配验证时,通常需要在正则表达式字符串的首部和尾部加上^和$,以匹配整个待验证的字符串。
● 查找与替换:判断给定字符串中是否包含满足正则表达式所指定的匹配规则的子串,如查找一段文本中的所包含的IP地址。另外,还可以对查找到的子串进行内容替换。
● 字符串分割与子串截取:基于子串查找功能还可以以符合正则表达式所指定的匹配规则的字符串作为分隔符对给定的字符串进行分割。
二、语法
三、元字符
四、运算符优先级
五、匹配规则
六、正则表达式简单操作
● 匹配:使用String类中的matches方法
String tel = "13172626346";// 11位数手机号 String regex = "1[3568]\\d{9}";// 第一位固定是1 , 第二位只能是3、5、6、8 , 第三位为数字出现9次;全部恰好出现11次 System.out.println(tel.matches(regex));// true
String str = "zhangsan lisi zhaoliu"; String [] names = str.split(" +");// 使用一个或多个空格切割 String str = "zhangsan.lisi.zhaoliu"; String [] names = str.split("\\.");// 点为特殊符号需要转义 // 切割重叠词,将叠词两边的字符串分割出来 String str = "zhangsanoooooooooooolisimmmmmmmmzhaoliu"; String [] names = str.split("(.)\\1+");// .为任意字符 , 使用(.)封装起来为组任意字符组,\\1是特殊字符进行转义。//(.)\\1+为捕获任意字符组(即相同字符的为一个组)
String str = "zhangsanoooooooooooolisimmmmmmmmzhaoliu"; str = str.replaceAll("(.)\\1+","*");// 捕获字符组替换为*符号; //zhangsan*lisi*zhaoliu str = str.replaceAll("(.)\\1+","$1");// 字符组(.....)$1,(.)$2,将字符组中的第二组替换重叠字符 // zhangsanolisimzhaoliu String tel = "13172626346"; tel = tel.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$3");// 编号$1为第一组...以此类推;这里将第二组替换为**** // 1317****6346
将正则规则进行对象的封装
Parttern p = Parttern.compile("a*b");
通过正则对象的matcher方法字符串相关联。获取要对字符串进行操作的匹配器对象Matcher
Matcher m = p.matcher("aaaab");
通过Matcher匹配器对象的方法对字符串进行操作。
boolean b = m.matchers();
String str = "da jia hao,ming tian bu fang jia"; String regex = "\\b[a-z]{3}\\b";// 三个字母组成的单词,\\b为边界 // 将正则封装成对象 Pattern p = Pattern.compile(regex); // 通过matcher方法获取匹配器对象Matcher Matcher m = p.matcher(str); // 通过matcher的方法对字符串进行操作,// 既然要获取三个字母组成的单词 while(m.find()){// 循环查找find()。 System.out.print("index:"+m.start()+"-"+m.end()+" = ");// 匹配子序列的索引位置包含头不包含尾。 System.out.print(m.group()+"\n");// 获取查找到匹配的子序列 }
七、捕获组
捕获组分类:
① 普通捕获组(Expression) - 使用方便
② 命名捕获组(?<name>Expression) - 使用清晰
1)普通捕获组
从正则表达式左侧开始,每出现一个左括号“(”记做一个分组,分组编号从1开始。0代表整个表达式。
对于时间字符串:2017-04-25,表达式如下
(\\d{4})-((\\d{2})-(\\d{2}))
有4个左括号,所以有4个分组
| 编号 | 捕获组 | 匹配 |
|---|---|---|
| 0 | (\d{4})-((\d{2})-(\d{2})) | 2017-04-25 |
| 1 | (\d{4}) | 2017 |
| 2 | ((\d{2})-(\d{2})) | 04-25 |
| 3 | (\d{2}) | 04 |
| 4 | (\d{2}) | 25 |
String DATE_STRING = "2017-04-25"; // 正则规则 String P_COMM = "(\\d{4})-((\\d{2})-(\\d{2}))"; // 将正则封装成对象 Pattern pattern = Pattern.compile(P_COMM); // 通过matcher方法获取匹配器对象Matcher Matcher matcher = pattern.matcher(DATE_STRING); // 通过matcher的方法对字符串进行操作 matcher.find(); System.out.println("matcher.group(0) value:" + matcher.group(0)); System.out.println("matcher.group(1) value:" + matcher.group(1)); System.out.println("matcher.group(2) value:" + matcher.group(2)); System.out.println("matcher.group(3) value:" + matcher.group(3)); System.out.println("matcher.group(4) value:" + matcher.group(4));
2)命名捕获组
每个以左括号开始的捕获组,都紧跟着“?”,而后才是正则表达式。
对于时间字符串:2017-04-25,表达式如下
(?<year>\\d{4})-(?<md>(?<month>\\d{2})-(?<date>\\d{2}))
有4个命名的捕获组,分别是
| 编号 | 名称 | 捕获组 | 匹配 |
|---|---|---|---|
| 0 | 0 | (?\d{4})-(?(?\d{2})-(?\d{2})) | 2017-04-25 |
| 1 | year | (?\d{4})- | 2017 |
| 2 | md | (?(?\d{2})-(?\d{2})) | 04-25 |
| 3 | month | (?\d{2}) | 04 |
| 4 | date | (?\d{2}) | 25 |
命名的捕获组同样也可以使用编号获取相应值
String DATE_STRING = "2017-04-25"; // 正则规则 String P_NAMED = "(?<year>\\d{4})-(?<md>(?<month>\\d{2})-(?<date>\\d{2}))"; // 将正则封装成对象 Pattern pattern = Pattern.compile(P_NAMED); // 通过matcher方法获取匹配器对象Matcher Matcher matcher = pattern.matcher(DATE_STRING); // 通过matcher的方法对字符串进行操作 matcher.find(); System.out.println("===========使用名称获取============="); System.out.println("matcher.group(0) value:" + matcher.group(0)); System.out.println("matcher.group('year') value:" + matcher.group("year")); System.out.println("matcher.group('md') value:" + matcher.group("md")); System.out.println("matcher.group('month') value:" + matcher.group("month")); System.out.println("matcher.group('date') value:" + matcher.group("date")); matcher.reset(); System.out.println("===========使用编号获取============="); matcher.find(); System.out.println("matcher.group(0) value:" + matcher.group(0)); System.out.println("matcher.group(1) value:" + matcher.group(1)); System.out.println("matcher.group(2) value:" + matcher.group(2)); System.out.println("matcher.group(3) value:" + matcher.group(3)); System.out.println("matcher.group(4) value:" + matcher.group(4));

浙公网安备 33010602011771号